قائمة فرعية لا يعمل في روبي النصي/وحدة ؟
-
19-09-2019 - |
سؤال
يعمل هذا:
>> 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