1

在应用程序中,有许多具有多态关联的模型定义如下:

has_many :mentions, :as => :mentionable, :dependent => :destroy

在库类中,收集所有可提及的模型以供以后迭代。

mentionables = Model1.all + Model2.all + Model3.all ...

这可行,但它只是静态的,这对于库代码来说是不可取的。底部语句会更直观,但它不起作用。

mentionables = Mentionable.all

Rails 中是否有一个 API 可以迭代具有使用 ':as => ...' 指令定义的多态关系的模型?

4

1 回答 1

1

我认为这里有两个问题,我会尽力回答这两个问题。首先,您需要一种方法来列出 Rails 应用程序中的所有模型。这个问题提供了一些方法,我更喜欢这个答案(通过sj26)。

# Really depends on how your classes are loaded, usually environment specific.
Rails.application.eager_load!
ActiveRecord::Base.descendants

之后,您需要解析模型关联以确定它们是否分配了 :as @option,并提取关联的类名。这是假设您的关联是这样创建的:

class Mentionee < ActiveRecord::Base
  has_many :mentions, :as => :mentionable, :dependent => :destroy, :class_name => 'Mentionable'
end

您可以使用reflect_on_all_associations方法来做到这一点(可能有一种更 ruby​​-esque 的方式来写这个):

Mentionee.reflect_on_all_associations.select {|a| a.options[:as] == :mentionable }

这将返回 Mentionable 的多态类模型。要加入这些,您可以执行以下操作(未经测试!):

Rails.application.eager_load!

mentionables = []

ActiveRecord::Base.descendants.each do |descendent|
  mentionables << descendent.reflect_on_all_associations.select{|a| a.options[:as] == :mentionable}
end

mentionables.each do |mentionable|
  # Do your work here
end
于 2013-02-13T20:10:21.687 回答