【问题标题】:Creating nested association records Ruby on Rails创建嵌套关联记录 Ruby on Rails
【发布时间】:2013-09-10 23:36:41
【问题描述】:

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

我希望我能用全新的眼光来帮助我发现这些天来一直困扰着我的东西。提前致谢! 我错过了什么/搞砸了什么?这似乎是微不足道的。

ActiveRecord::NestedAttributes 显然不高兴。

class ContentGroup < ActiveRecord::Base
  attr_protected

  has_many :contents, :dependent=>:destroy

  accepts_nested_attributes_for :contents
end

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

class SortItem < ActiveRecord::Base
  attr_accessible :position, :sortable_id, :sortable_type
  belongs_to :sortable, :polymorphic=>true
end

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

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

一个额外的巢穴炸毁了:

> 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'

希望可以解决这个问题,如果我有明显的错误,请见谅。

【问题讨论】:

    标签: ruby-on-rails activerecord associations nested-attributes


    【解决方案1】:

    这最终变得非常愚蠢,错误日志根本没有帮助,甚至没有一点帮助。因此,我最终弄乱了您应该能够传递给 Model.new() 的哈希,以便实例化嵌套在哈希中的所有关联(大多数情况下,rails doc 非常好)。但是,我发现似乎没有记录的内容(除非有人可以指出我在文档中的正确位置)是:

    您必须为哈希数组分配一个键才能正确 实例化一个新的子关联记录:

    (Rails 控制台示例)

    不正确:

    > p = {"contents_attributes"=>{"sort_item_attributes"=>{"position"=>"1"}}}
    

    正确:

    > p = {"contents_attributes"=>[{"sort_item_attributes"=>{"position"=>"1"}}]}
    

    注意非常细微的区别:您需要有嵌套关联的键 - "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 工作让我解决这个问题也没有帮助,所以我的大脑有点不正常。

    希望我在这个问题上花费的时间可以帮助某人快速找到相同/相似问题的答案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多