这工作:
>> 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
?
子类无效,在base.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使得它保护)。
你可以为用户做同样的,你没有为富:添加一个XYZ()方法。
你不需要重新声明(如在Tim的答案 ), 或提供一个辅助方法(如鲁特格尔的答案 )。 你只需要改变的方法(这是一个类的方法,需要一些有心计)的权限:
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