8

我正在使用 Rails 3.2.8。如果状态记录尚不存在,我需要创建状态记录。如果存在状态记录,我什么也不做。所以我的代码是这样的:

user_level_status = UserLevelStatus.where(user_id: user_id, level_id: level_id).first
if !user_level_status
  UserLevelStatus.create(user_id: user_id, level_id: level_id, status: UserLevelStatus::READY)
end

在 Rails/ActiveRecord 中有没有更好的方法来处理这个问题?有没有等价的机制find_or_create_by_?我可以使用find_or_create_by_user_id并检查level_id吗?我只会丢弃结果,所以即使这样也不是那么优雅。

4

4 回答 4

19

就在这里。

导轨 3

user_level_status = UserLevelStatus.find_or_create_by_user_id_and_level_id(user_id, level_id)

导轨 4:

user_level_status = UserLevelStatus.find_or_create_by(user_id: user_id, level_id: level_id)

你应该在你的模型中设置默认值status

于 2012-09-21T09:27:57.980 回答
5

你应该使用

UserLevelStatus.where(user_id: user_id, level_id: level_id).first_or_create(status: UserLevelStatus::READY)
于 2012-09-22T06:46:23.793 回答
1

利用find_or_create_*

hash = {user_id: user_id, level_id: level_id, status: UserLevelStatus::READY}
UserLevelStatus.find_or_create_by_user_id_and_level_id_and_status(hash)

已编辑对于您的情况,您应该使用以下内容

hash = {user_id: user_id, level_id: level_id}
UserLevelStatus.find(:first, :conditions => hash) || UserLevelStatus.create(hash.merge({status: UserLevelStatus::READY}) 
于 2012-09-21T09:27:51.413 回答
0

另一种选择是

UserLevelStatus.where(user_id: user_id, level_id: level_id).first ||
  UserLevelStatus.create(user_id: user_id, level_id: level_id, status: UserLevelStatus::READY)
于 2012-09-21T12:56:36.730 回答