В чем разница между методом построения и создания в отношениях 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
? И когда я должен использовать, который?
Ответы
Ответ 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
используется в новом методе.