Rails + Postgres - hstore自动转换字符串

时间:2014-06-18 01:45:13

标签: ruby-on-rails ruby ruby-on-rails-4 hstore postgresql-9.3

我在我的某个模型上使用hstore来存储具有浮点值的哈希值。我需要定期访问并执行商店中的值的计算。

我目前使用这些值的解决方案是将它们转换为浮动,无论我访问它们的哪个地方都非常干净。有没有办法让我修改store_accessor方法以自动将我从商店读取的任何值转换为浮动?

我知道我可以通过为它们as described in the docs编写一个函数来对特定键执行此操作,但是我有一个很长的可能键列表,所以这种方式也不是很干。

1 个答案:

答案 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似乎做得更好,并且还处理布尔,整数字段。