我正在使用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
吗?我只是放弃了结果,所以即使不那么优雅。
答案 0 :(得分:18)
是的。
user_level_status = UserLevelStatus.find_or_create_by_user_id_and_level_id(user_id, level_id)
user_level_status = UserLevelStatus.find_or_create_by(user_id: user_id, level_id: level_id)
答案 1 :(得分:4)
你应该使用
UserLevelStatus.where(user_id: user_id, level_id: level_id).first_or_create(status: UserLevelStatus::READY)
答案 2 :(得分:1)
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)
EDITED对于您的情况,您应该使用以下
hash = {user_id: user_id, level_id: level_id}
UserLevelStatus.find(:first, :conditions => hash) || UserLevelStatus.create(hash.merge({status: UserLevelStatus::READY})
答案 3 :(得分: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)