2016-06-22 5 views
0

入れ子になっていて問題を起こしている一連のRailsモデルを作成しようとしています。基本的には、Institutionsがチェーンの先頭にあり、多くはIntellectualObjectsです。 IntellectualObjectsには、それぞれGenericFilesが多数あります。これまでのところ、とても簡単です。 IntellectualObjectsGenericFilesの両方とも、多くの場合、PremisEventsである必要があります。これは私が困っているところです。 IntellectualObjectsは、自身のPremisEventsを持ち、GenericFilesが所有するPremisEventsにリンクする必要があります。Railsで複雑なネストされたクラスを作成する方法

has_many :premis_eventsのモデルを設定した場合は、問題なしでイベントを作成できますが、イベントの完全なリストを取得しようとすると、GenericFilesに関連付けられたイベントは表示されません。上記の行の下にhas_many :premis_events, through: :generic_filesという行を追加すると、IntellectualObjectのすべてのイベントにアクセスできますが、IntellectualObjectsの場合はPremisEventsを正しく作成できません - イベントは作成されますが、正しく関連付けられませんすべて)を知的オブジェクトと結びつけるので、イベントのリストに終わることはありません。

IntellectualObjectsに関連付けられたイベントとGenericFilesに関連付けられたイベントの両方のタイプがIntellectualObjectから取得できるようにする方法はありますか?

IntellectualObjectモデルの関連部分:

belongs_to :institution 
has_many :generic_files 
has_many :premis_events, through: :intellectual_objects 
has_many :premis_events, through: :generic_files 
has_many :checksums, through: :generic_files 
accepts_nested_attributes_for :generic_files 

GenericFileモデルの関連部分:

belongs_to :intellectual_object 
has_many :premis_events 
has_many :checksums 
accepts_nested_attributes_for :checksums 

PremisEventモデルの関連部分:

belongs_to :intellectual_object 
belongs_to :generic_file 
+0

したがって、 'PremisEvent'は' GenericFile'または 'IntellectualObject'に属していますか?しかし、両方の決して? –

+0

種類。 'GenericFiles'は' IntellectualObjects 'に属しているので 'GenericFile'に属する' PremisEvents'も 'IntellectualObject'に属します。さらに、「知的客体」にのみ属する「PremisEvents」もあります。 – user3254621

答えて

0

私のコードでもう少し実験をした後に、にPremisEventsを作成するときに、関連するコードを明示的に定義する必要があることが分かりました。すべては今のように機能します。

0

何あなたはが必要です210 :class_nameオプションの助けを借りて。

1

GenericFileに属しているPremisEventIntellectualObjectを定義するソリューションは、このユースケースに最適です。しかし、よりスケーラブルで一般的な解決策(例えば、Institutionに簡単に同じ動作を追加するなど)をお探しの場合は、これはまさに私がthrough_hierarchy gemを作成したものです。これにより、PremisEventを1つのリソースに割り当てることができます。関連するIDをチェーン全体に渡って設定する心配はありません。この宝石を使って書くことができます

+0

これは 'IntellectualObjects'が' GenericFiles'が所有していない独自の 'PremisEvents'を持つことを可能にしますか? – user3254621

+0

別のアソシエーションまたはスコープを定義しないで、またはスコープを手動で追加するだけではありません。たとえば、 'intellectual_object.premis_events 'を使うことができます。(resource_type: "IntellectualObject") 'を使用して、独自のスコープまたは関連付けで定義することができます。これが一般的な使用事例であれば、おそらく外部のID( 'generic_file_id'、' intellectual_object_id')を持つ方が直感的です。なぜなら、それはデータ構造内に意図された使用法を置くからです。 –

+0

ええ、それは私がすでにやっていることです。これは興味深い考えで、ある時点で実装しようとしているかもしれませんが、今は 'GenericFiles'に関連するイベントのために' IntellectualObject'を明示的に定義することがそのトリックを行うと思います。 – user3254621

関連する問題