序列化activerecord后如何访问列值

Cha*_*nap 11 activerecord ruby-on-rails-3

我有一个这样的简单模型:

class User < ActiveRecord::Base
  serialize :preferences
end
Run Code Online (Sandbox Code Playgroud)

我想从序列化之前访问mysql的原始值,而不是值.可能吗?

我知道我可以使用

ActiveRecord::Base.connection.execute("select * from users")
Run Code Online (Sandbox Code Playgroud)

但我想从User模型中访问.

de_*_*777 27

更新

好的,这就是你要找的东西:

User.find(params[:id]).attributes_before_type_cast["preferences"][:value]
Run Code Online (Sandbox Code Playgroud)

这将以序列化形式返回字符串.

这是我能找到的最接近的,如果你已经从数据库中取出了对象,它将无法工作.

很抱歉误读了您的问题.您也可以在User模型中使用它.

保留旧的答案,以防其他方式对某人有帮助.

老答案

为了确保我理解这个问题,您需要表格中的原始数据.rails序列化并放入数据库的数据.

EX.你输入['site_id','last_update','last_restart']并获得"---\n- site_id\n- last_update\n- last_restart\n"它,它被放入数据库并保存.您想要"---\n- site_id\n- last_update\n- last_restart\n"从数据库中检索它:

好吧,它从数据库中获得了一些粉丝,但你可以这样做.

在一个项目中,我有一个序列化数组调用devise_table_preferences,它列出了以特定顺序显示在表中的首选项,如下所示:

user.devise_table_preferences = ['site_id','last_update','last_restart']
Run Code Online (Sandbox Code Playgroud)

它的序列化视图是这样的:

"---\n- site_id\n- last_update\n- last_restart\n"
Run Code Online (Sandbox Code Playgroud)

使用上面的方法,我做了如下查询:

preference = ActiveRecord::Base.connection.execute("SELECT devise_table_preferences FROM users WHERE id = #{@user.id}")
Run Code Online (Sandbox Code Playgroud)

它在控制台中返回一个对象,如下所示:

preference = #<Mysql2::Result:0x007fe4cdf34850> 
Run Code Online (Sandbox Code Playgroud)

运行:

preference.first[0]
Run Code Online (Sandbox Code Playgroud)

给我这个:

"---\n- site_id\n- last_restart\n"
Run Code Online (Sandbox Code Playgroud)

我知道这是一个很大的工作,但它肯定会以序列化的方式为您提供数据.希望它能帮到你.

  • 很确定这不再有效,因为序列化会覆盖`attributes_before_type_cast` (3认同)