8

所以我很感兴趣是否有办法将字符串转换为活动记录类。

示例:我有一个User继承自ActiveRecord::Base. 有什么方法可以将字符串转换"User"User类,以便我可以使用ActiveRecord诸如find,where等方法。

4

4 回答 4

11

String#constantize返回带有字符串名称的常量的值。因为"User"这是你的User课:

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

您可以将其分配给变量并调用 ActiveRecord 方法:

model = "User".constantize
model.all
# => [#<User id:1>, #<User id:2>, ...]
于 2013-06-04T11:34:37.907 回答
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)

于 2013-06-04T12:11:55.117 回答
2

更安全的方法:

"string".classify.constantize.find(....)
于 2013-06-04T12:35:56.880 回答
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])

没有任何安全顾虑。

于 2013-06-04T12:57:10.097 回答