【问题标题】:Hash getter and setter on ActiveRecord objectActiveRecord 对象上的哈希 getter 和 setter
【发布时间】:2014-01-20 17:34:59
【问题描述】:

我有一个 ActiveRecord 对象,它将哈希属性序列化到我的数据库列之一。我想摆脱这种情况,因为通过其中一个哈希键进行查询非常困难/不干净。因此,我将散列的所有键拆分为模型上的单独属性。但是,我有很多地方使用此代码,所以与此同时,当我转换所有我想在我的 ActiveRecord 对象上拥有一个仅用于 Rails 的属性(即它不会填充回我的数据库)时像以前一样将这些属性添加到哈希中,并允许设置和获取值。

例如,这就是我曾经拥有的:

class MyCls < ActiveRecord::Base
    serialize :state, Hash
    attr_accessible :id, :mode

我正在摆脱 :state 并将其替换为构成此哈希的 7 个不同值。但我仍然希望能够像这样访问这些值:MyObj.state[:obj_num]。即使我现在拥有obj_num 作为属性(即MyObj.obj_num)。我认为最好的方法是拥有一个带有 getter 和 setter 的 state 属性,但我似乎不太能理解语法。对于 setter,我需要同时支持将哈希设置为一个整体并设置单个键。

【问题讨论】:

    标签: ruby-on-rails rails-activerecord


    【解决方案1】:

    首先要说:我认为这不是最好的解决方案。当您在 3 年后再次触摸此代码时,它会像“我做了什么?”......它是用其他代码替换代码中所有 sn-ps 的最佳解决方案。

    您可以在删除此行 serialize :state 后添加对象的 method_missing 方法,以获取所有想要访问对象不再存在的序列化字段的调用。它在这里解释:

    http://blog.enriquez.me/2010/2/21/dont-forget-about-respond-to-when-implementing-method-missing/

    它被称为元编程。这就是使所有find_by_attribute_name 的东西在不定义这些方法的情况下工作的“rails 魔法”。可以是很酷的东西,但你需要非常小心,你需要知道你在做什么。

    【讨论】:

    • 感谢您的提示。我想我无法隐瞒我对 Ruby/Rails 开发比较陌生的事实 :)
    • 我没想到。元编程在这里并不容易,也并不为人所知,尽管大量的 rails 默认功能都是基于这样的东西。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-04
    • 2015-01-21
    • 1970-01-01
    • 1970-01-01
    • 2017-11-14
    • 1970-01-01
    相关资源
    最近更新 更多