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または) が 1 つだけであることを確認できます。:form

于 2013-04-04T18:45:06.160 に答える