在ActiveRecord对象上散列getter和setter

时间:2014-01-20 17:35:00

标签: ruby-on-rails rails-activerecord

我有一个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,我需要支持将哈希设置为一个整体并设置单个键。

1 个答案:

答案 0 :(得分:1)

首先要说:我不认为这是最好的解决方案。当你再次触摸这段代码时可以说3年就会像“WHAAAA已经完成了吗?”......它是用代码替换代码中所有代码段的最佳解决方案。

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

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

它被称为元编程。这就是“轨道魔术”,它使所有find_by_attribute_name内容工作而不定义这些方法。可以很酷,但你需要非常小心,你需要知道你在做什么。