1

我正在尝试从嵌套形式建立多态关系,该形式与我找到的所有示例都相反。我希望有人指出我的方式的错误。

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

似乎大多数人会通知或表单构建容器,但在我的情况下,通知或表单包含少量内容(文件位置或几个 db 字段),因此从构建通知或表单要干燥得多容器。

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

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

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

然后建造,但这不是一种气味吗?有没有更好的办法?

感谢您的阅读!

4

1 回答 1

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) 实际关联。

于 2013-04-04T18:45:06.160 回答