创建嵌套关联记录Ruby on Rails

mkr*_*a11 3 activerecord ruby-on-rails associations nested-attributes

显然我在下面的例子中忽略了一些非常简单的事情,我试图在实例化新的父记录时创建嵌套的关联记录.

我希望有一双新鲜的眼睛,我的帮助可以找到几天来一直在吃的东西.提前致谢!我错过了什么/弄乱了什么?这似乎是微不足道的.

ActiveRecord :: NestedAttributes显然不高兴.

class ContentGroup < ActiveRecord::Base
  attr_protected

  has_many :contents, :dependent=>:destroy

  accepts_nested_attributes_for :contents
end
Run Code Online (Sandbox Code Playgroud)
class Content < ActiveRecord::Base 
  attr_protected

  has_one :sort_item, :as=>:sortable
  belongs_to :content_group, :dependent=>:destroy

 accepts_nested_attributes_for :sort_item
end
Run Code Online (Sandbox Code Playgroud)
class SortItem < ActiveRecord::Base
  attr_accessible :position, :sortable_id, :sortable_type
  belongs_to :sortable, :polymorphic=>true
end
Run Code Online (Sandbox Code Playgroud)

在rails控制台中,轻度嵌套的调用按预期工作:

> p = {"sort_item_attributes"=>{"position"=>"1"}}
> b = Content.new(p)
 => Content id: nil, content_group_id: nil
Run Code Online (Sandbox Code Playgroud)

一个额外的巢爆炸:

> p = {"contents_attributes"=>{"sort_item_attributes"=>{"position"=>"1"}}}
> cg = ContentGroup.new(p)

 ActiveRecord::UnknownAttributeError: unknown attribute: position
    from /.rvm/gems/ruby-1.9.3-p392/gems/activerecord-3.2.13/lib/active_record/attribute_assignment.rb:88:in `block in assign_attributes'
    from /.rvm/gems/ruby-1.9.3-p392/gems/activerecord-3.2.13/lib/active_record/attribute_assignment.rb:78:in `each'
    from /.rvm/gems/ruby-1.9.3-p392/gems/activerecord-3.2.13/lib/active_record/attribute_assignment.rb:78:in `assign_attributes'
    from /.rvm/gems/ruby-1.9.3-p392/gems/activerecord-3.2.13/lib/active_record/base.rb:498:in `initialize'
    from /.rvm/gems/ruby-1.9.3-p392/gems/activerecord-3.2.13/lib/active_record/reflection.rb:183:in `new'
    from /.rvm/gems/ruby-1.9.3-p392/gems/activerecord-3.2.13/lib/active_record/reflection.rb:183:in `build_association'
    from /.rvm/gems/ruby-1.9.3-p392/gems/activerecord-3.2.13/lib/active_record/associations/association.rb:233:in `build_record'
    from /.rvm/gems/ruby-1.9.3-p392/gems/activerecord-3.2.13/lib/active_record/associations/collection_association.rb:112:in `build'
    from /.rvm/gems/ruby-1.9.3-p392/gems/activerecord-3.2.13/lib/active_record/nested_attributes.rb:406:in `block in assign_nested_attributes_for_collection_association'
    from /.rvm/gems/ruby-1.9.3-p392/gems/activerecord-3.2.13/lib/active_record/nested_attributes.rb:401:in `each'
    from /.rvm/gems/ruby-1.9.3-p392/gems/activerecord-3.2.13/lib/active_record/nested_attributes.rb:401:in `assign_nested_attributes_for_collection_association'
    from /.rvm/gems/ruby-1.9.3-p392/gems/activerecord-3.2.13/lib/active_record/nested_attributes.rb:289:in `contents_attributes='
    from /.rvm/gems/ruby-1.9.3-p392/gems/activerecord-3.2.13/lib/active_record/attribute_assignment.rb:94:in `block in assign_attributes'
    from /.rvm/gems/ruby-1.9.3-p392/gems/activerecord-3.2.13/lib/active_record/attribute_assignment.rb:93:in `each'
    from /.rvm/gems/ruby-1.9.3-p392/gems/activerecord-3.2.13/lib/active_record/attribute_assignment.rb:93:in `assign_attributes'
    from /.rvm/gems/ruby-1.9.3-p392/gems/activerecord-3.2.13/lib/active_record/base.rb:498:in `initialize'
    from (irb):10:in `new'
    from (irb):10
    from /.rvm/gems/ruby-1.9.3-p392/gems/railties-3.2.13/lib/rails/commands/console.rb:47:in `start'
    from /.rvm/gems/ruby-1.9.3-p392/gems/railties-3.2.13/lib/rails/commands/console.rb:8:in `start'
    from /.rvm/gems/ruby-1.9.3-p392/gems/railties-3.2.13/lib/rails/commands.rb:41:in `<top (required)>'
    from script/rails:6:in `require'
Run Code Online (Sandbox Code Playgroud)

希望这可以修复,对不起,如果我有一个明显的错误.

mkr*_*a11 6

好吧,这最终真的很愚蠢,错误日志根本没有帮助,甚至没有一点点.所以,我最终搞乱了你应该能够传递给Model.new()的哈希,以便实例化嵌套在哈希中的所有关联(rails doc在大多数时候非常好).但是,我发现似乎没有文件记录(除非有人能指出我在文档中的位置的正确方向)是:

您必须将一个键分配给散列的ARRAY才能正确实例化一个新的子关联记录:

(示例rails控制台)

不正确的:

> p = {"contents_attributes"=>{"sort_item_attributes"=>{"position"=>"1"}}}
Run Code Online (Sandbox Code Playgroud)

正确:

> p = {"contents_attributes"=>[{"sort_item_attributes"=>{"position"=>"1"}}]}
Run Code Online (Sandbox Code Playgroud)

注意非常微妙的区别:你需要拥有嵌套关联的密钥, - "contents_attributes",指向一个ARRAY - [{"sort_item_attributes"=> {"position"=>"1"}}],因为它是在这种情况下,content_groups具有has_many内容.

has_one关系,例如内容has_one sort_item的关系,缺乏这种必要性.

从理论上讲,这是完全合理的,但错误日志并没有指出我有任何好的方向来解决我遇到的问题,并且rails doc似乎不足.我最终必须阅读一些nested_attributes.rb代码/示例行93-95.另外,我做了一堆让我解决这个问题的ajax工作没有帮助,所以我的大脑有点不合适.

希望我花时间在这个上面的时间将帮助有人找到一个相同/类似问题的快速答案.