gpt4 book ai didi

ruby-on-rails - 使用 find_or_create_by 创建一个包含嵌套对象的对象

转载 作者:行者123 更新时间:2023-12-03 15:55:48 27 4
gpt4 key购买 nike

我想像这样的查询。

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

最佳答案

我正在为 find_or_create_by 使用更新的 Rails 3.2 语​​法因为它将在 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之后保存后,它会将其 ID 放入 movie_id照片记录上的字段。它无法在父级之前保存子级,因为它不知道要使用什么 id。

如果您使用的是 3.2 之前的 Rails 版本,它将如下所示:
@movie = Movie.find_or_create_by_title "W00t!", :director => 'Steven Speilberg',
:photos_attributes => [{
:caption => "Thrilling!"
}]

关于ruby-on-rails - 使用 find_or_create_by 创建一个包含嵌套对象的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12984811/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com