سؤال

يعمل هذا:

>> 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 يجعل المحمية).

هل يمكن أن تفعل الشيء نفسه بالنسبة للمستخدم كما فعلت فو:إضافة xyz (طريقة).

نصائح أخرى

أنت لا تحتاج إلى redeclare (كما في تيم الجواب) أو تقدم بنفس الطريقة (كما في Rutger الجواب).تحتاج فقط إلى تغيير الإذن من طريقة (والتي يجري فئة الأسلوب يتطلب بعض الاشكالات):

class User < ActiveRecord::Base

  class <<self
    public :subclasses
  end

end

فقط للتغلب على حقوق الوصول و ليس تغيير أي شيء, النظر في استخدام #إرسال الأسلوب الذي لديه حق الوصول إلى طرق خاصة.

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