我在我的某个模型上使用hstore
来存储具有浮点值的哈希值。我需要定期访问并执行商店中的值的计算。
我目前使用这些值的解决方案是将它们转换为浮动,无论我访问它们的哪个地方都非常干净。有没有办法让我修改store_accessor方法以自动将我从商店读取的任何值转换为浮动?
我知道我可以通过为它们as described in the docs编写一个函数来对特定键执行此操作,但是我有一个很长的可能键列表,所以这种方式也不是很干。
答案 0 :(得分:1)
之前我没有使用hstore
,但研究了您在问题中提供的文档。好吧,hstore
看起来非常有用(太糟糕了,只有在postgreSQL数据库中可用,但肯定是学到了新东西)。
阅读文档,
注意 - 如果您使用的是PostgreSQL特定列,例如hstore或 json不需要商店提供的序列化。只是 使用store_accessor来生成访问器方法。意识到 这些列使用字符串键控哈希并且不允许访问 使用符号。
此外:
可以使用stored_attributes检索存储的属性名称。
User.stored_attributes[:settings] # [:color, :homepage]
因此,我们将使用stored_attribute
哈希在stored_attributes
中获取单独的字段,并将我们在stored_attribute
上声明的字段作为数组。现在,我们需要覆盖数组中所有元素的访问器。我们可以使用define_method动态覆盖访问者。这就是我想出来的。
class WorkingBill < ActiveRecord::Base
store_accessor :prices, :cost_price, :selling_price
stored_attributes[:prices].each do |price_column_name|
define_method("#{key}=") do |value|
super(value.to_f)
end
define_method(key) do
super.to_f
end
end
end
我没有测试过这段代码,因为我现在没有开发环境。另外,我怀疑super
调用是否适用于define_method
。所以,试试吧。一旦我获得开发环境,我也会测试它。
另外,正如@Vakily评论的那样,gem https://github.com/jalkoby/active_store_accessor似乎做得更好,并且还处理布尔,整数字段。