我认为这里有两个问题,我会尽力回答这两个问题。首先,您需要一种方法来列出 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