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

Sql 创建如果不';ActiveRecord中不存在函数?,sql,ruby-on-rails,ruby-on-rails-3,activerecord,ruby-on-rails-3.2,Sql,Ruby On Rails,Ruby On Rails 3,Activerecord,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: UserLe

我使用的是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\u或\u create\u by\u user\u id
并检查
level\u id
?我会丢弃结果,这样即使结果也不那么优雅。

使用

为您的案例编辑,您应该使用以下内容

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

轨道3 轨道4: 您应该设置。

另一种选择是

UserLevelStatus.where(user_id: user_id, level_id: level_id).first ||
  UserLevelStatus.create(user_id: user_id, level_id: level_id, status: UserLevelStatus::READY)
你应该使用

UserLevelStatus.where(user_id: user_id, level_id: level_id).first_or_create(status: UserLevelStatus::READY)

如果实际的
用户id
级别id
状态
字段不同,这将创建一个新的
用户级别状态
,不是吗?因此,如果在
级别id
范围内对
用户id
的唯一性进行验证,然后,您的解决方案将创建一个无效对象。这是最优雅的解决方案,但我希望能够创建具有多种不同状态中的一种的状态记录。有时需要准备就绪状态,有时需要其他状态。我想我可以检查user_level_status对象的status字段,如果为nil,则设置它。有没有办法在find_或create_by_*方法中设置status字段?从Rails 4开始,动态创建的find_或create_by_XXX版本似乎已被弃用,取而代之的是find_或create_by(),并传入名称和值。
user_level_status = UserLevelStatus.find_or_create_by(user_id: user_id, level_id: level_id)
UserLevelStatus.where(user_id: user_id, level_id: level_id).first ||
  UserLevelStatus.create(user_id: user_id, level_id: level_id, status: UserLevelStatus::READY)
UserLevelStatus.where(user_id: user_id, level_id: level_id).first_or_create(status: UserLevelStatus::READY)