2011-08-12 10 views
0

私はポリモーフィック団体で、このスキーマを設定する方法のまわりで私の頭をラップしようとしている:Railsのポリモーフィックな関連+ fields_for

「ドキュメント」は1つのメタデータオブジェクトを持っているが、これは「PDFMetaData」または "のいずれかとすることができますTXTMetaData "である。これは動作しますが、私はこの

を行うことができます
class Document 
    belongs_to :metadata, :polymorphic => true 
end 

class PDFMetaData 
    has_one :document, :as => :metadata 
end 

class TXTMetaData 
    has_one :document, :as => :metadata 
end 

この関連付けを設定するには

が、それは一種の私にとっては逆のように感じている:

私の懸念はある文書has_oneのメタデータオブジェクトではなく、反対?

また、新しい文書の入れ子になったフォームを作成しようとすると、実際に問題が発生しています。私はfields_forを使うことができることを知っていますが、どのようなオブジェクトであるかをどのように知っていますか? (PDFMetaDataまたはTXTMetaData)。私はどのような書類を持っているのかに応じて別々の部分を表現する必要がありますか?

私は最初の質問で後者が関係していることを恐れ、私は何かひどく間違ったことをしています。

おかげ

答えて

0

あなたはこのケースでbelongs_toの& has_oneの配置との混同についてのから来ている場所、私が見ることができますが、根拠はFOREIGN_KEYは、DBスキーマにある場合に基づいています。ドキュメントテーブルには、PdfMetaDataオブジェクトに関連するforeign_keyが含まれています。したがって、has_many関係を持つ方法がないため、他の方法で関係を記述するのは意味がありません(1つのデータベース行?)

2番目の問題については、とPDFMetaDataクラスの有効な属性のリストによって解決されることをお勧めします。彼らは同じ属性(または少なくともあなたの形式で利用可能たいものが同じである)を持っている場合は、異なる属性を公開するしかしなら、あなたは

fields_for :metadata do |meta_fields| 
    meta_fields.text_field :attr 
    meta_fields.text_fields :attr2 
end 

とそうで大丈夫でなければなりません私はあなたのメタデータオブジェクトのクラスを検出し、それに応じて行動することをお勧めします

meta_obj = document.metadata 
fields_for :metadata, meta_obj do |meta_fields| 
    if meta_obj.is_a?(PDFMetaData) 
    meta_fields.text_field :attr 
    meta_fields.text_fiels :attr2 
    elsif meta_obj.is_a?(TXTMetaData) 
    meta_fields.text_field :other_attr 
    meta_fields.text_fiels :other_attr2 
    end 
end 
関連する問題