【问题标题】:Rails+Postgres - hstore automatic conversion of stringsRails+Postgres - hstore 自动转换字符串
【发布时间】:2014-06-18 01:45:13
【问题描述】:

我在我的一个模型上使用hstore 来存储带有浮点值的散列。我需要定期访问并计算存储中的值。

我当前使用这些值的解决方案是将它们转换为在我访问它们的任何地方浮动,这是非常不干燥的。有没有办法让我修改 store_accessor 方法以自动将我从商店读取的任何值转换为浮点数?

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

【问题讨论】:

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


【解决方案1】:

我之前没有使用过hstore,但研究了您在问题中提供的文档。好吧,hstore 看起来真的很有用(可惜它只能在 postgreSQL DB 中使用,但肯定学到了一些新东西)。

通过阅读文档,

注意 - 如果您使用 PostgreSQL 特定的列,例如 hstore 或 json 不需要 store 提供的序列化。简单地 使用 store_accessor 来生成访问器方法。意识到 这些列使用字符串键控哈希并且不允许访问 使用符号。

还有:

可以使用stored_attributes 检索存储的属性名称。

User.stored_attributes[:settings] # [:color, :homepage]

因此,我们将使用 stored_attributes 哈希获取 stored_attribute 中的单独字段,并将获取我们在 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 似乎做得更好,还可以处理布尔整数字段。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-14
    • 1970-01-01
    • 1970-01-01
    • 2015-04-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多