web-dev-qa-db-ja.com

Rails first_or_create ActiveRecordメソッド

Railsでのfirst_or_create/first_or_create!メソッドの機能

documentation によると、メソッド "has no description" ...

26
Marco Prins

ガイド から

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
54
Pavan

ソースを確認すると、それらがほとんど同じであることがわかります。唯一の違いは、最初のメソッドが「create」メソッドを呼び出し、もう1つのメソッドが「create!」を呼び出すことです。つまり、作成が成功しなかった場合、2番目の例外では例外が発生します。

1
dobrinov

指定したものと一致する最初のレコードを取得するか、一致がない場合は作成します

0
j-dexx