2010-11-14 39 views
5

Tôi có một đối tượng mô hình phân lớp ActiveRecord. Ngoài ra, bằng cách sử dụng STI, tôi đã xác định các lớp con của đối tượng này, xác định các loại và hành vi khác nhau. Cấu trúc trông giống như sau:Cách lấy một mảng các lớp con trong Rails

class AppModule < ActiveRecord::Base 
    belongs_to :app 
end 

class AppModuleList < AppModule 

end 

class AppModuleSearch < AppModule 

end 

class AppModuleThumbs < AppModule 

end 

Bây giờ, trong chế độ xem người dùng có tùy chọn tạo Mô-đun ứng dụng mới, tôi muốn họ chọn từ menu thả xuống. Tuy nhiên tôi đã không thể có được một danh sách các lớp con của AppModule bằng cách sử dụng các lớp con() phương pháp:

<% form_for(@app_module) do |f| %> 
    <%= f.error_messages %> 

    <p> 
    <%= f.label :type %><br /> 
    <%= f.select(:type, options_from_collection_for_select(@app_module.subclasses().map{ |c| c.to_s }.sort)) %> 
    </p> 
    <p> 
    <%= f.submit 'Create' %> 
    </p> 
<% end %> 

tôi nhận được:

NoMethodError: undefined method `subclasses' for #<AppModule:0x1036b76d8> 

Tôi đánh giá cao sự giúp đỡ nào. Cảm ơn rất nhiều!

+0

Phiên bản Ruby on Rails nào bạn đang sử dụng? – outis

+0

Đường ray 2.3.8, Ruby 1.8.7 –

+0

Lớp có phương thức 'hậu duệ 'trong [3.0.0] (http://rubydoc.info/docs/rails/3.0.0/Class#descendants-instance_method), nhưng không [2.3.8] (http://rubydoc.info/docs/rails/2.3.8/Class#descendants-instance_method). – outis

Trả lời

10

Dường như subclasses và tương tự là recent addition (phương pháp tồn tại trên các lớp khác nhau tại các thời điểm khác nhau, nhưng liên tục bị xáo trộn và xóa; liên kết đó dường như là điểm sớm nhất mà phương thức bị kẹt) . Nếu nâng cấp lên phiên bản RoR mới nhất không phải là một tùy chọn, bạn có thể viết subclasses của riêng mình và điền vào nó bằng cách sử dụng Class#inherited (đó là số descendents_tracker của RoR).

+1

Đối với bất kỳ ai được Google chỉ định ở đây, nếu các lớp của bạn được tải xuống, DescendantsTracker sẽ không biết về chúng cho đến khi chúng được sử dụng. –

5

AppModule.descendants.map &:name là những gì bạn đang tìm kiếm. Như trong:

<% form_for(@app_module) do |f| %> 
    <%= f.error_messages %> 

    <p> 
    <%= f.label :type %><br /> 
    <%= f.select(:type, options_from_collection_for_select(AppModule.descendants.map(&:name).sort)) %> 
    </p> 
    <p> 
    <%= f.submit 'Create' %> 
    </p> 
<% end %> 
Các vấn đề liên quan