我正在实施一种方法,该方法将用于项目的许多地方。从符号中获取模型类
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