Что делает метод first_or_create
/ в Rails?Rails first_or_create Метод ActiveRecord
Согласно documentation, метод «нет описания» ...
Что делает метод first_or_create
/ в Rails?Rails first_or_create Метод ActiveRecord
Согласно documentation, метод «нет описания» ...
От Guides
first_or_create
The first_or_create
метод проверяет ли NIL первые возвращается или нет. Если он возвращает nil, тогда вызывается create. Это очень эффективно при сочетании метода. Давайте посмотрим пример.
Предположим, вы хотите найти клиента с именем «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
к вашей модели клиента. Если вы попытаетесь создать нового Клиента, не пройдя количество заказов, запись будет недействительной, и будет создано исключение:
Client.where(:first_name => 'Andy').first_or_create!(:locked => false)
# => ActiveRecord::RecordInvalid: Validation failed: Orders count can't be blank
Получает первую запись, которая соответствует тому, что вы указали или создает один, если нет совпадений
Если вы отметите источник, вы увидите, что они почти идентичны. Единственное различие заключается в том, что первый вызывает метод «create», а другой - «create!». Это означает, что второй вызовет исключение, если создание не будет выполнено.