我正在實施一種方法,該方法將用於項目的許多地方。從符號中獲取模型類
def do association
end
「協會」 是一個符號,像:articles
,:tags
,:users
等
當關聯:articles
,我需要Article模型工作。
當關聯是:users
時,我需要使用User模型。
等等
我知道,我可以寫一個輔助方法,它返回模型類,根據所提供的符號。但是有沒有一個可以使用的方法呢?
我正在實施一種方法,該方法將用於項目的許多地方。從符號中獲取模型類
def do association
end
「協會」 是一個符號,像:articles
,:tags
,:users
等
當關聯:articles
,我需要Article模型工作。
當關聯是:users
時,我需要使用User模型。
等等
我知道,我可以寫一個輔助方法,它返回模型類,根據所提供的符號。但是有沒有一個可以使用的方法呢?
Rails提供一個在String
類用於此目的的所謂classify
方法。
:users.to_s.classify.constantize
#User
:line_items.to_s.classify.constantize
#LineItem
編輯:
如果您正試圖恢復與一個關聯有關的類,使用這種方法:
Author.reflect_on_association(:books).klass
# => Book
這將解決該關聯名稱沒有按」場景噸匹配類名稱。
E.g:
class Order
has_many :line_items
has_many :active_line_items, :class_name => "LineItem",
:conditions => {:deleted => false}
end
在上面的例子中,:active_line_items
將導致ActiveLineItem
和我們原來的代碼將拋出錯誤。
瞭解更多關於here。
這將工作
(:users.to_s.singularize.capitalize.constantize).find :all, :conditions => ["name = ?", "john"]
而且隨着你的榜樣
association.to_s.singularize.capitalize.constantize
很酷:)謝謝! – AntonAL 2011-03-15 18:46:44
當類名有兩個部分時,此解決方案將不起作用,例如:':order_details'將導致'Order_detail'而不是'OrderDetail'。 – 2011-03-15 20:50:38
你還應該看看'#safe_constantize'變體,它和'#constanzize'基本相同,但是如果找不到類,則不會引發NameError。相反,它返回'nil'。這變得比例外更方便一些。例如:'model_name.to_s.classify.safe_constantize || Event' – 2016-02-24 10:39:01