通过Rails中的Polymorphic Type查找所有内容?

Lan*_*ard 10 ruby-on-rails helpers polymorphic-associations

有没有办法在Rails中找到特定多态类型的所有多态模型?所以如果我有Group,Event和Project都有一个声明,如:

has_many :assignments, :as => :assignable

我可以这样做:

Assignable.all

...要么

BuiltInRailsPolymorphicHelper.all("assignable")

那样就好了.

编辑:

...这样Assignable.all返回[Event, Group, Product](类数组)

Har*_*tty 16

没有直接的方法.我写了这个猴子补丁ActiveRecord::Base.这适用于任何课程.

class ActiveRecord::Base

  def self.all_polymorphic_types(name)
    @poly_hash ||= {}.tap do |hash|
      Dir.glob(File.join(Rails.root, "app", "models", "**", "*.rb")).each do |file|
        klass = File.basename(file, ".rb").camelize.constantize rescue nil
        next unless klass.ancestors.include?(ActiveRecord::Base)

        klass.
          reflect_on_all_associations(:has_many).
          select{ |r| r.options[:as] }.
          each do |reflection|
            (hash[reflection.options[:as]] ||= []) << klass
          end
      end
    end
    @poly_hash[name.to_sym]
  end

end
Run Code Online (Sandbox Code Playgroud)

现在您可以执行以下操作:

Assignable.all_polymorphic_types(:assignable).map(&:to_s)
# returns ['Project', 'Event', 'Group']
Run Code Online (Sandbox Code Playgroud)