清单子类不Ruby脚本/控制台中工作?(Listing subclasses doesn't

2019-09-29 05:05发布

这工作:

>> 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

Answer 1:

子类无效,在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()方法。



Answer 2:

你不需要重新声明(如在Tim的答案 ), 提供一个辅助方法(如鲁特格尔的答案 )。 你只需要改变的方法(这是一个类的方法,需要一些有心计)的权限:

class User < ActiveRecord::Base

  class <<self
    public :subclasses
  end

end


Answer 3:

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

User.send(:subclasses)


Answer 4:

tables = ActiveRecord::Base.connection.tables {|t| t.classify.constantize rescue nil}.compact
subclasses = tables.map do |table|
  table.singularize.classify.constantize
end


文章来源: Listing subclasses doesn't work in Ruby script/console?