我正在使用更新的 Rails 3.2 语法,find_or_create_by
因为它将在 Rails 4.0 中弃用。重要的是accepts_nested_attributes_for
在您的电影模型中具有如下所示:
class Movie < ActiveRecord::Base
has_many :photos
accepts_nested_attributes_for :photos
end
这允许您<relation-name>_attributes
在您的情况下使用表单指定模型属性中的键photo_attributes
。
@movie = Movie.where(:title => 'foo').first_or_create :director => 'Steven Speilberg',
:photos_attributes => [{
:caption => "Thrilling!"
}]
@movie.save
在此之后,您只需保存父模型,这将自动保存子模型,同样在您的案例照片中。有必要先保存父母,因为孩子需要知道将什么id放入孩子记录中。所以@movie
保存后,它会将它的 idmovie_id
放在照片记录的字段中。它无法在父母之前保存孩子,因为它不知道要使用什么 id。
如果您使用的是 3.2 之前的 Rails 版本,它将如下所示:
@movie = Movie.find_or_create_by_title "W00t!", :director => 'Steven Speilberg',
:photos_attributes => [{
:caption => "Thrilling!"
}]