Rails 3 Polymorphic嵌套属性

时间:2013-04-04 16:46:43

标签: ruby-on-rails ruby nested-forms polymorphic-associations

我正在尝试从嵌套的表单构建一个多态关系,这个表单是我发现的所有示例。我希望有人指出我的方式的错误。

class Container < ActiveRecord::Base
      belongs_to :content, :polymorphic => true
end
class Notice < ActiveRecord::Base
      has_one :container, :as => :content
end
class Form < ActiveRecord::Base
      has_one :container, :as => :content
end

似乎大多数人会从通知或表单构建一个Container ,但在我的情况下,通知或表单包含少量内容(文件位置或几个数据库字段)所以它很多dry'er从容器中建立通知或表格。

我以为我可以通过添加accepts_nested_attributes_for :content来解决这个问题,但当我尝试创建一个带有嵌套通知的Container(寻找内容,而不是多态关联)时,这会给我一个unrecognized attribute :notice

我可以手动完成,并明确排除嵌套字段,如

 if params[:container].has_key('notice')   
     @c = Container.new(params[:container].except(:notice))

然后建造,但不是那种气味?还有更好的方法吗?

感谢您的阅读!

1 个答案:

答案 0 :(得分:0)

嵌套属性旨在从父级到子级,而不是相反。此外,在这种情况下,嵌套属性将如何知道您是否尝试创建NoticeForm对象?

如果您发现DRYer要从容器中构建内容,那么您可能已将其关联内部 - 请尝试将架构更改为:

class Container < ActiveRecord::Base
  has_one :notice
  has_one :form
end

class Notice < ActiveRecord::Base
  belongs_to :container
end

class Form < ActiveRecord::Base
  belongs_to :container
end

如果需要,您可以使用验证来确保只有一个孩子(:notice:form)实际关联。