加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-17 02:32:42 所属栏目:百科 来源:网络整理
导读:我想像这样的查询. Movie.find_or_create_by_title(title: 'foo').photos.find_or_create_by_name(name: 'bar') 给定的查询将创建Photo对象,但不会考虑其父Movie. = #Photo id: 3,movie_id: nil … 有什么方法可以把电影传给它吗? 更新:我尝试“同时保存两
我想像这样的查询.

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

解决方法

我正在使用更新的Rails 3.2语法find_or_create_by,因为它将在Rails 4.0中弃用.重要的是在Movie模型中使用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!"
                                                }]

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读