如何在Rails中创建复杂的嵌套类

时间:2016-06-22 20:06:32

标签: ruby-on-rails

我正在尝试创建一系列嵌套的Rails模型,但这样做很麻烦。基本的向下运行是Institutions位于链的顶部并且有许多IntellectualObjects。每个IntellectualObjects都有GenericFilesIntellectualObjects。到目前为止,这么容易。 GenericFilesPremisEvents两者也应该有很多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

3 个答案:

答案 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。一切都按现在的方式运作。