我正在尝试创建一系列嵌套的Rails模型,但这样做很麻烦。基本的向下运行是Institutions
位于链的顶部并且有许多IntellectualObjects
。每个IntellectualObjects
都有GenericFiles
个IntellectualObjects
。到目前为止,这么容易。 GenericFiles
和PremisEvents
两者也应该有很多IntellectualObjects
。这是我遇到麻烦的地方。 PremisEvents
应该拥有自己的PremisEvents
,并且可以链接到GenericFiles
所拥有的IntellectualObject
。
如果我使用has_many :premis_events
设置GenericFiles
模型,我可以毫无问题地创建这些事件,但是当我尝试检索完整的事件列表时,与{{1}相关联的事件} 缺失。如果我在上面的行下方添加了行has_many :premis_events, through: :generic_files
,那么我可以访问IntellectualObject
应该拥有的所有事件,但我无法为{{1}正确创建PremisEvents
- 事件被创建但是没有正确地(或者根本)与智能对象相关联,因此它们不会最终出现在事件列表中。
有没有办法执行此操作,以便可以从IntellectualObjects
检索两种类型的事件,与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
答案 0 :(得分:1)
对于这个用例,我认为为IntellectualObject
PremisEvent
定义GenericFile
的解决方案对我来说是最好的。但是,如果您正在寻找更具伸缩性和通用性的解决方案(例如,也可以轻松地将同样的行为添加到Institution
),这正是我创建through_hierarchy gem的原因。这将允许您仅将PremisEvent
分配给单个资源,而不必担心在链中一直设置相关ID。使用这个gem,你可以写
class PremisEvent < ActiveRecord::Base
belongs_to :resource, polymorphic: true
end
class IntellectualObject < ActiveRecord::Base
has_many :generic_files
through_hierarchy [:generic_files] do
has_many :premis_events, as: :resource
end
end
class Institution < ActiveRecord::Base
has_many :intellectual_objects
has_many :generic_files, through: :intellectual_objects
through_hierarchy [:intellectual_objects, :generic_files] do
has_many :premis_events, as: :resource
end
end
答案 1 :(得分:0)
在GROUP BY
选项的帮助下,您需要Polymorphic Associations。
答案 2 :(得分:0)
在对我的代码进行更多实验后,我意识到我只需要在为IntellectualObject
创建PremisEvents
时明确定义关联的GenericFiles
。一切都按现在的方式运作。