Подтвердить что ты не робот

В чем разница между методом построения и создания в отношениях ActiveRecord?

У меня есть Пользователь, у которого может быть 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? И когда я должен использовать, который?

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

while @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

Ответ 3

Из guide

build_association (attributes = {})

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

create_association (attributes = {})

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

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