有没有办法用两个数据库列备份新的Rails 5属性

时间:2016-05-31 17:12:10

标签: ruby-on-rails postgresql ruby-on-rails-5

我正在考虑将新的Rails 5 attributes API用于自定义数据类型,理想情况下将数据存储在两个数据库列中,一个用于数据value,另一个用于一些额外的{{1}信息。

属性API似乎只能用于一个数据库列,我想知道我是否错过了使用两列的方法。

实施例

想象一下Money对象,其中一个typedecimal列为值,一个integer列为货币代码。我传入我的自定义货币对象,将其存储两列,然后将其读回将两列合并为一个Money对象。

我已经考虑将值和货币序列化到一个Postgres JSON列中,但我希望能够对值列进行快速SQL string查询和排序,因此这并不是&#39看起来很理想。

提前感谢任何见解。

2 个答案:

答案 0 :(得分:2)

我猜您正在考虑在模型中创建ValueObject

ActiveRecord::Aggregations。例如:

class Customer < ActiveRecord::Base
  composed_of :balance, class_name: "Money", mapping: %w(balance amount)
end

class Money
  include Comparable
  attr_reader :amount, :currency
  EXCHANGE_RATES = { "USD_TO_DKK" => 6 }

  def initialize(amount, currency = "USD")
    @amount, @currency = amount, currency
  end

  def exchange_to(other_currency)
    exchanged_amount = (amount * EXCHANGE_RATES["#{currency}_TO_#{other_currency}"]).floor
    Money.new(exchanged_amount, other_currency)
  end

  def ==(other_money)
    amount == other_money.amount && currency == other_money.currency
  end

  def <=>(other_money)
    if currency == other_money.currency
      amount <=> other_money.amount
    else
      amount <=> other_money.exchange_to(currency).amount
    end
  end
end

答案 1 :(得分:1)

不幸的是,不能直接回答你的问题,但你的例子让我思考。 money-rails gem允许使用单独的货币栏。也许值得深入挖掘宝石,看看他们在幕后做了些什么。