2011-03-15 25 views
9

Bir projenin birçok yerinde kullanılacak bir yöntem uygulamıyorum.Model sınıfından sembol al

def do association 

end 

"dernek" dernek :articles aldığım zaman, Madde modeli ile çalışmak gerekir :articles, :tags, :users vb

gibi bir semboldür.

İlişkilendirme :users olduğunda, Kullanıcı modeliyle çalışmam gerekir.

Vb

Sağladığımız sembolü bağlı olarak modeli sınıfını döndüren bir yardımcı yöntemini yazabilirsiniz olduğunu, biliyoruz. Ancak bunun için kullanıma hazır bir yöntem var mı?

cevap

26

Raylar bu amaçla String sınıfı classify denilen bir yöntem sağlar ile olacaktır.

:users.to_s.classify.constantize 
#User 

:line_items.to_s.classify.constantize 
#LineItem 

Düzenleme:

Author.reflect_on_association(:books).klass 
# => Book 

Bu dernek adı kokan senaryoyu ele alacak: Bir dernek ile ilişkili sınıfını almaya çalışıyorsanız, bu yaklaşımı kullanmak

t sınıf adını eşleştirin.

Örn: Yukarıdaki örnekte

class Order 
    has_many :line_items 
    has_many :active_line_items, :class_name => "LineItem", 
      :conditions => {:deleted => false} 
end 

, :active_line_items ActiveLineItem sonuçlanacaktır ve orijinal kod hata verir. Bu here hakkında daha fazla bilgi edinin.

+0

Ayrıca, temelde # # constanzize 'ile aynı olan, ancak sınıf bulunamadıysa bir NameError'ı yükseltmeyen "# safe_constantize" varyantına da bakmalısınız. Bunun yerine 'nil 'değerini döndürür. Bu istisna ile biraz daha kullanışlı olduğu ortaya çıkıyor. Örneğin: 'model_name.to_s.classify.safe_constantize || Event' –

1

Bu

(:users.to_s.singularize.capitalize.constantize).find :all, :conditions => ["name = ?", "john"] 

çalışmak Ve örnek

association.to_s.singularize.capitalize.constantize 
+0

Harika :) Teşekkürler! – AntonAL

+0

Bu çözüm, sınıf adı iki parça olduğunda işe yaramaz. Örneğin: ': order_details'' OrderDetail' yerine 'Order_detail' sonucunu verir. –