12

first_or_create私はその方法が本当に好きです:

# Find the first user named Scarlett or create a new one with a particular last name.
User.where(:first_name => 'Scarlett').first_or_create(:last_name => 'Johansson')
# => <User id: 2, first_name: 'Scarlett', last_name: 'Johansson'>

ユーザーが存在しないか異なる場合、last_name 'Johannson' でユーザーを更新する方法を知りたいと思っていました。これを行う最も簡単な方法を探しています。上記のようなワンライナーが理想的です。

考えられるアプローチの 1 つは、 first_or_initialize を update_attributes と組み合わせて使用​​することです。このアプローチに関する唯一の懸念は、提供されたフィールドが 100% 一致した場合でも更新が実行されることです。

4

2 に答える 2

23

ザイドは正解に非常に近いです。

User.where(first_name: 'Scarlett').first_or_create.update(last_name: 'Johansson')

詳細な違いはこちら。(注: これは Rails 3+ および Rails 4+ 用です)

  1. first_or_createvs.の違いは、メソッドfirst_or_initialize_initialize使用し.new、レコードを保存しない vs.create自動保存することです。

  2. と の違いは、値の.updateハッシュがある場合に使用するもので、通常は のようなフォーム送信から得られます。一方、 上記のように各属性を簡単に指定できますなど..update_attributes.update_attributesparams.update(field_column: value, field_column2: value2)

そして、Zaidが言ったように、それは と の両方に適用され.update.update_attributesRailsデータベースの更新は「...変更が必要な場合にのみデータベースにヒットします...」

于 2014-09-12T02:48:11.603 に答える
6

first_or_initializeupdate_attributes問題ないはずです。Rails は、変更が必要な場合にのみデータベースにヒットするほどスマートupdate_attributesです (コンソール/ログを使用して自分で確認できるはずです)。

于 2013-05-02T02:08:21.627 に答える