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)

EDITED あなたのケースでは、以下を使用する必要があります

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 に答える