2013-06-04 35 views
7

所以我很感兴趣,如果有一种方法可以将字符串转换为活动记录类。将字符串对象转换为活动记录类

实施例:我已经从ActiveRecord::Base继承了User类。 有没有什么办法可以将字符串转换到User类,所以我可以用ActiveRecord方法,如findwhere

回答

10

String#constantize返回一个常具有指定名称。对于这是你User类:

"User".constantize 
# => User(id: integer, ...) 

您可以指定这一个变量,并调用ActiveRecord的方法:

model = "User".constantize 
model.all 
# => [#<User id:1>, #<User id:2>, ...] 
+0

严格来说,它返回绑定到给定常量名的任何对象,不仅仅是模块/类。 –

+0

@MarekLipka没错,我已经更新了我的答案。 – Stefan

+0

谢谢,那正是我正在寻找的。 –

3

你只是在你的代码编写

str="User" 
class_name=str.constantize 

,你会得到 像这样的格式数据

User(id: integer, login: string, name: string, email: string, user_rank: integer 

用户的类名

第二种方法是 CLASS_NAME = Object.const_get(STR)

1

更安全的方式:

"string".classify.constantize.find(....) 
1

在你的字符串类,而不是定义一个方法

 def constantize_with_care(list_of_klasses=[]) 
     list_of_klasses.each do |klass| 
      return self.constantize if self == klass.to_s 
      end 
     raise "Not allowed to constantize #{self}!" 
    end 

然后使用

"user".constantize_with_care([User]) 

,现在你可以做这样的事情

params[:name].constantize_with_care([User]) 

无任何安全隐患。