创建如果ActiveRecord中不存在函数?

at.*_*at. 7 sql activerecord ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.2

我正在使用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
Run Code Online (Sandbox Code Playgroud)

有没有更好的方法来处理Rails/ActiveRecord?有没有相同的机制find_or_create_by_?我可以使用find_or_create_by_user_id并检查level_id吗?我只是放弃了结果,所以即便这样也不那么优雅.

KAR*_*ván 18

就在这里.

Rails 3

user_level_status = UserLevelStatus.find_or_create_by_user_id_and_level_id(user_id, level_id)
Run Code Online (Sandbox Code Playgroud)

导轨4:

user_level_status = UserLevelStatus.find_or_create_by(user_id: user_id, level_id: level_id)
Run Code Online (Sandbox Code Playgroud)

您应该在模型中设置默认值status.


小智 5

你应该用

UserLevelStatus.where(user_id: user_id, level_id: level_id).first_or_create(status: UserLevelStatus::READY)
Run Code Online (Sandbox Code Playgroud)


Sal*_*lil 2

使用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)
Run Code Online (Sandbox Code Playgroud)

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

hash = {user_id: user_id, level_id: level_id}
UserLevelStatus.find(:first, :conditions => hash) || UserLevelStatus.create(hash.merge({status: UserLevelStatus::READY}) 
Run Code Online (Sandbox Code Playgroud)