2011-03-15 90 views
9

我正在實施一種方法,該方法將用於項目的許多地方。從符號中獲取模型類

def do association 

end 

「協會」 是一個符號,像:articles:tags:users

當關聯:articles,我需要Article模型工作。

當關聯是:users時,我需要使用User模型。

等等

我知道,我可以寫一個輔助方法,它返回模型類,根據所提供的符號。但是有沒有一個可以使用的方法呢?

回答

26

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

+0

你還應該看看'#safe_constantize'變體,它和'#constanzize'基本相同,但是如果找不到類,則不會引發NameError。相反,它返回'nil'。這變得比例外更方便一些。例如:'model_name.to_s.classify.safe_constantize || Event' – 2016-02-24 10:39:01

1

這將工作

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

而且隨着你的榜樣

association.to_s.singularize.capitalize.constantize 
+0

很酷:)謝謝! – AntonAL 2011-03-15 18:46:44

+0

當類名有兩個部分時,此解決方案將不起作用,例如:':order_details'將導致'Order_detail'而不是'OrderDetail'。 – 2011-03-15 20:50:38