【问题标题】:how to access column value after serialization activerecord序列化activerecord后如何访问列值
【发布时间】:2012-06-14 15:37:19
【问题描述】:

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

class User < ActiveRecord::Base
  serialize :preferences
end

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

我知道我可以使用

ActiveRecord::Base.connection.execute("select * from users")

但我想从User 模型访问。

【问题讨论】:

    标签: ruby-on-rails-3 activerecord


    【解决方案1】:

    更新

    好的,这就是你要找的:

    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"
    

    我知道这是一项很大的工作,但它肯定会以序列化的方式为您提供数据。希望对你有所帮助。

    【讨论】:

    • 我知道我可以做到这一点(正如我在问题中所说)。我只想知道是否可以从 User 模型中获取。不管怎么说,还是要谢谢你。 :)
    • @Chamnap 我编辑了我的答案,希望能回答您的问题,请参阅答案的更新部分。希望这比旧部分对您有所帮助。
    • 我试了一下,还是不行。我检查了源代码,它只是返回@attributes,那个已经序列化了。
    • @Chamnap,嗯...这应该适合你。它在控制台中对我有用,我的设置与您相同。在我的 Rails 控制台中运行 User.first.attributes_before_type_cast["netbridge_table_preference"][:value] 给了我:=&gt; "---\n- site_id\n- last_restart\n" 而不是 ['site_id','last_restart']。为了验证,这就是你想要的对吗?您希望它序列化,而不是反序列化并转回数组、散列等。我正在运行 rails 3.2.3 和 Ruby 1.9.3p194 并将其恢复得非常好。
    • 很确定这不再有效,因为序列化覆盖attributes_before_type_cast
    【解决方案2】:

    attributes_before_type_cast 对我不起作用。

    User.first.instance_variable_get(:@attributes)['preferences'].serialized_value
    

    即使对象已加载,这也有效。

    【讨论】:

      【解决方案3】:

      我想这些天你想说的是:

      User.find(params[:id]).typecasted_attribute_value('preferences')

      【讨论】:

      • NoMethodError Exception: private method 'typecasted_attribute_value' called (Rails 4.2)。也许它的访问权限最近发生了变化。
      • 你应该在 Rails 4 中使用preferences_before_type_cast
      猜你喜欢
      • 2013-09-08
      • 2011-03-21
      • 1970-01-01
      • 2011-06-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多