Что значит create! что означает в rails?

#ruby-on-rails #ruby

#ruby-on-rails #рубин #ruby

Вопрос:

Что это делает в Rails?

 create! do |user| 
  #initialise user 
end
  

Я понял, что это создает пользовательские объекты и сохраняет их в базе данных. Чем это отличается от простого произнесения user.new(...) and user.save() ?

Ответ №1:

В двух словах:

  • create! вызывает исключение, create возвращая объект (несохраненный объект, если он не проходит проверки).
  • save! выдает ошибку при save возврате true / false .
  • save не принимает атрибуты, create принимает.

new не сохраняет. new похоже на build в ActiveRecord контексте. create сохраняет в базу данных и возвращает true или false в зависимости от проверки модели. create! сохраняется в базе данных, но вызывает исключение, если есть ошибки в проверке модели (или любая другая ошибка).

Комментарии:

1. Я поддержал, потому что это хороший ответ. Однако, create не возвращает логическое значение. Он возвращает экземпляр объекта независимо от того, прошел он проверку или нет.

2. @AdityaSanghi — спасибо за ваш ответ. вы говорите: «создайте! сохраняется в базе данных, но вызывает исключение, если есть ошибки в проверке модели (или любая другая ошибка).» ———> как он может сохранить что-либо в базе данных, если проверки не переданы?

3. @bkspurgeon это не сохраняется, если проверки завершаются неудачей. Метод bang в случае сбоя ведет себя иначе, чем версия без bang. Версия Bang вызывает исключение, а версия без bang возвращает false .

Ответ №2:

Когда не удалось создать запись, create! генерируется исключение, new а затем save (или просто create без восклицательного знака) завершается молча.

Ответ №3:

create принимает атрибуты, поэтому использование блока здесь несколько необычно. Упомянутый вами код выполняет инициализацию в блоке, который передается create! Ему, в принципе, такой же, new за которым следует инициализация, а затем save!

Существует множество вариантов save, сохранить!, создать, завершить!, обновить, обновить! и т.д., Также существуют варианты с точки зрения проверок и обратных вызовов

Для получения подробной информации, пожалуйста, ознакомьтесь с API: (это обсуждается по первой ссылке)

http://api.rubyonrails.org/classes/ActiveRecord/Base.html

http://apidock.com/rails/ActiveRecord/Base

http://m.onkey.org/active-record-query-interface

Комментарии:

1. немного неправильно. создать/create!/сохранить/save! все они немного отличаются. создать/create! возьмите атрибуты модели. сохранить/save! не принимайте параметры атрибута модели. методы с bang (создать! / сохранить!) вызывают исключение при сбое проверки, а методы без bang (создать / сохранить) — нет.

2. также save не возвращает nil, он возвращает результат проверки (true или false).

3. это смешно. Я никогда не говорил, что save это будет принимать аргументы. Я указал на соответствующую документацию — чем это не так??