Railsでのfirst_or_create
/first_or_create!
メソッドの機能
documentation によると、メソッド "has no description" ...
ガイド から
first_or_create
first_or_create
メソッドは、first
がnilを返すかどうかをチェックします。 nilを返す場合は、create
が呼び出されます。これは、where
メソッドと組み合わせると非常に強力です。例を見てみましょう。
「Andy」という名前のクライアントを検索するとします。クライアントがない場合は作成し、さらにロックされた属性をfalseに設定します。これを実行するには、次のコマンドを実行します。
Client.where(:first_name => 'Andy').first_or_create(:locked => false)
# => #<Client id: 1, first_name: "Andy", orders_count: 0, locked: false, created_at: "2011-08-30 06:09:27", updated_at: "2011-08-30 06:09:27">
このメソッドによって生成されるSQLは次のようになります。
SELECT * FROM clients WHERE (clients.first_name = 'Andy') LIMIT 1
BEGIN
INSERT INTO clients (created_at, first_name, locked, orders_count, updated_at) VALUES ('2011-08-30 05:22:57', 'Andy', 0, NULL, '2011-08-30 05:22:57')
COMMIT
first_or_create
は、すでに存在するレコードまたは新しいレコードを返します。この例では、Andyという名前のクライアントがまだないため、レコードが作成されて返されます。
first_or_create!
新しいレコードが無効な場合、first_or_create!
を使用して例外を発生させることもできます。検証はこのガイドでは説明されていませんが、一時的に追加するとします
validates :orders_count, :presence => true
あなたのクライアントモデルに。 orders_countを渡さずに新しいクライアントを作成しようとすると、レコードが無効になり、例外が発生します。
Client.where(:first_name => 'Andy').first_or_create!(:locked => false)
# => ActiveRecord::RecordInvalid: Validation failed: Orders count can't be blank
ソースを確認すると、それらがほとんど同じであることがわかります。唯一の違いは、最初のメソッドが「create」メソッドを呼び出し、もう1つのメソッドが「create!」を呼び出すことです。つまり、作成が成功しなかった場合、2番目の例外では例外が発生します。
指定したものと一致する最初のレコードを取得するか、一致がない場合は作成します