这个工作:

>> class Foo 
>>   def xyz()
>>     Foo.subclasses
>>   end
>> end
=> nil
>> class Bar < Foo
>> end
=> nil
>> class Quux < Bar
>> end
=> nil
>> Foo.new.xyz()
=> ["Quux", "Bar"]

但这不可行。 User 一类是在我的应用程序。

>> User.subclasses
NoMethodError: protected method `subclasses' called for #<Class:0x20b5188>
    from [...]/vendor/rails/activerecord/lib/active_record/base.rb:1546:in `method_missing'
    from (irb):13

但是,这并!

>> Foo.subclasses
=> ["Quux", "Bar"]

什么在这里?我怎么会列子类的 User?

有帮助吗?

解决方案

小类是重写并提出保护基础。rb。看看 http://www.google.com/codesearch/p?hl=en&sa=N&cd=1&ct=rc#m8Vht-lU3vE/vendor/rails/activerecord/lib/active_record/base.rb&q=active_record/base.rb (线1855定义的方法类行1757使得保护).

你可以做同样的用户为你做了Foo:增加一个xyz()方法。

其他提示

你不需要再次声明(作为在 蒂姆的答案) 提供一个辅助方法(如在 鲁格的答案).你只需要更改的权限的方法(其中,作为一个类方法,需要一些诡计):

class User < ActiveRecord::Base

  class <<self
    public :subclasses
  end

end

就可以解决的访问权限,并不会改变任何东西,可以考虑使用能够访问私有方法的#send方法。

User.send(:subclasses)
tables = ActiveRecord::Base.connection.tables {|t| t.classify.constantize rescue nil}.compact
subclasses = tables.map do |table|
  table.singularize.classify.constantize
end
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top