6

次のように first_or_create を呼び出します。

collection = Collection.first_or_create(:title => title)

結果が既存のエントリであるか、新しく作成されたエントリであるかを判断する方法はありますか? これまでのところ、私が思いついた最善の解決策は、first_or_initialize を使用することです。

collection = Collection.first_or_initialize(:title => title)
if collection.id.nil?
  <process>
  collection.save
end

しかし、これは少しハックな気がします。この情報を first_or_create から直接取得する方法はありますか?

4

3 に答える 3

22

first_or_create新しいレコードが作成された場合にのみ実行されるブロックを取ります。たとえば、そのブロック内に新しいレコードであることを示すフラグを設定できます。

MyObject.where(attr: "value").first_or_create do |obj|
  @my_object_created = true
end
于 2015-01-31T23:50:17.603 に答える
20

私が知る限り、あなたは知ることができません。created_at時間を確認する (信頼できない) か、代わりに を使用して が truefirst_or_initializeかどうかを確認し、new_record?そうであれば他の操作を行ってから を呼び出すという2 つのオプションがありますsave!。他のリレーションが保存されるまで保存を完了させたくない場合があり、同じデータベース トランザクションですべての操作を実行したい場合があるため、これが最善の方法である可能性があります。

于 2013-01-24T21:31:52.070 に答える
3

を使用first_or_createすると、それが新しく作成されたオブジェクトなのか、データベースからのオブジェクトなのかを確実に知ることはできません。created_at考えられるトリッキーな解決策は、値を現在の時刻と比較することです。これは、オブジェクトを頻繁に作成しない場合に機能します。

ところで、それが新しく作成されたオブジェクトであるかどうかを知る必要があるのはなぜですか?

于 2013-01-24T21:19:52.643 に答える