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!" }] (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |