我正在尝试从嵌套的表单构建一个多态关系,这个表单是我发现的所有示例。我希望有人指出我的方式的错误。
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))
然后建造,但不是那种气味?还有更好的方法吗?
感谢您的阅读!
答案 0 :(得分:0)
嵌套属性旨在从父级到子级,而不是相反。此外,在这种情况下,嵌套属性将如何知道您是否尝试创建Notice
或Form
对象?
如果您发现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
)实际关联。