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 …

映画を渡す方法はありますか?

更新: 「一度に両方を保存」しようとする理由は、ムービーに少なくとも 1 つの写真が必要であるという検証が行われているためです。参照: https://stackoverflow.com/a/12962317/471313

4

2 に答える 2

4

find_or_create_byRails 4.0 で非推奨になるため、更新された Rails 3.2 構文を使用しています。重要なことは、次のようaccepts_nested_attributes_forMovieモデルに を含めることです。

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保存された後movie_id、写真レコードのフィールドにその ID が配置されます。親の前に子を保存することはできません。使用する ID がわからないためです。

Rails 3.2 より前のバージョンを使用している場合は、次のようになります。

@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 に答える