2011-03-15 45 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