我正在考虑将新的Rails 5 attributes API用于自定义数据类型,理想情况下将数据存储在两个数据库列中,一个用于数据value
,另一个用于一些额外的{{1}信息。
属性API似乎只能用于一个数据库列,我想知道我是否错过了使用两列的方法。
想象一下Money对象,其中一个type
或decimal
列为值,一个integer
列为货币代码。我传入我的自定义货币对象,将其存储两列,然后将其读回将两列合并为一个Money对象。
我已经考虑将值和货币序列化到一个Postgres JSON列中,但我希望能够对值列进行快速SQL string
查询和排序,因此这并不是&#39看起来很理想。
提前感谢任何见解。
答案 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允许使用单独的货币栏。也许值得深入挖掘宝石,看看他们在幕后做了些什么。