我有一个像这样的简单模型:
class User < ActiveRecord::Base
serialize :preferences
end
我想从 mysql 访问原始值,而不是序列化之前的值。是否可以?
我知道我可以使用
ActiveRecord::Base.connection.execute("select * from users")
但我想从User
模型中访问。
我有一个像这样的简单模型:
class User < ActiveRecord::Base
serialize :preferences
end
我想从 mysql 访问原始值,而不是序列化之前的值。是否可以?
我知道我可以使用
ActiveRecord::Base.connection.execute("select * from users")
但我想从User
模型中访问。
更新
好的,这就是您要查找的内容:
User.find(params[:id]).attributes_before_type_cast["preferences"][:value]
这将以序列化形式返回字符串。
这是我能找到的最接近的方法,如果您已经从数据库中提取了对象,它将无法工作。
很抱歉误读了您的问题。您也可以从 User 模型中使用它。
留下旧答案,以防万一其他方式对某人有帮助。
旧答案
只是为了确保我理解这个问题,您需要表格中的原始数据。rails 的数据序列化并放入数据库。
前任。您输入['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']
它的序列化视图是这样的:
"---\n- site_id\n- last_update\n- last_restart\n"
使用上面的方法,我进行了如下查询:
preference = ActiveRecord::Base.connection.execute("SELECT devise_table_preferences FROM users WHERE id = #{@user.id}")
它在控制台中返回一个对象,如下所示:
preference = #<Mysql2::Result:0x007fe4cdf34850>
跑步:
preference.first[0]
给了我这个:
"---\n- site_id\n- last_restart\n"
我知道这是一项很大的工作,但它肯定会以序列化的方式为您提供数据。希望它可以帮助你。
attributes_before_type_cast 对我不起作用。
User.first.instance_variable_get(:@attributes)['preferences'].serialized_value
即使加载了对象,这也有效。
我想这些天你想说的是:
User.find(params[:id]).typecasted_attribute_value('preferences')