4

我想像这样的查询。

Movie.find_or_create_by_title(title: 'foo').photos.find_or_create_by_name(name: 'bar')

给定的查询将创建Photo对象,但不会考虑其父对象Movie

 => #<Photo id: 3, movie_id: nil …

有什么办法可以把电影传给它吗?

更新:我尝试“同时保存两者”的原因是因为我有一个验证,要求电影至少有一张照片。请参阅:https ://stackoverflow.com/a/12962317/471313

4

2 回答 2

4

我正在使用更新的 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!"
                                                }]
于 2012-10-20T03:42:46.087 回答
0
movie = Movie.where(title: 'foo').first
if movie.nil?
  movie = Movie.new(title: 'foo')
  movie.photos.build(name: 'bar')
  movie.save
else
  movie.photos.create(name: 'bar')
end
于 2012-10-20T03:38:56.540 回答