В чем разница между методом build и create в отношениях ActiveRecord? - PullRequest
12 голосов
/ 11 августа 2011

У меня есть пользователь, который может иметь 0 или 1 профиль. В моем контроллере я хочу сохранить профиль, если даны некоторые значения, следующим образом:

# PUT /users/1
def update
  @user = User.find(params[:id])

  if @user.update_attributes(params[:user])
    if params[:profile][:available] == 1 #available is a checkbox that stores a simple flag in the database.
      @user.create_profile(params[:profile])
    end
  else 
    #some warnings and errors
  end
end

Часть, о которой я задаюсь вопросом, это create_profile, магия create_somerelationname. Как это можно сравнить с магией build_somerelationname? И когда я должен использовать какой?

Ответы [ 3 ]

17 голосов
/ 11 августа 2011

Разница между build и create в том, что create также сохраняет созданный объект, так как build возвращает только вновь созданный объект (без его сохранения).

Документация несколько скрыта здесь .

Таким образом, в зависимости от того, довольны ли вы возвращенным объектом или нет, вам необходимо create (поскольку вы больше не будете его менять) соответственно build, поскольку вы хотите обновить его перед повторным сохранением (что сохранит сохранить операцию)

10 голосов
/ 11 августа 2011

@user.build_profile совпадает с

Profile.new(:user_id => @user.id)

, в то время как @user.create_profile совпадает с

Profile.create(:user_id => @user.id)

@user.create_profile может быть представлено с build_profile следующим образом:

profile = @user.build_profile
profile.save

http://apidock.com/rails/ActiveRecord/Associations/ClassMethods/has_one

7 голосов
/ 11 августа 2011

Из справочника

build_association (attribute = {})

Метод build_association возвращает новый объект связанного тип. Этот объект будет создан из переданных атрибутов, и будет установлена ​​связь через его внешний ключ, но связанный объект еще не будет сохранен.

create_association (attribute = {})

Метод create_association возвращает новый объект связанного тип. Этот объект будет создан из переданных атрибутов, и ссылка через его внешний ключ будет установлена. В дополнение связанный объект будет сохранен (при условии, что он валидация).

Что вы должны использовать, зависит от требования. Обычно build_association используется в новом методе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...