Ruby on rails 有没有办法用两个数据库列来支持新的Rails 5属性
我正在考虑使用新的自定义数据类型,理想情况下将数据存储在两个数据库列中,一个用于数据Ruby on rails 有没有办法用两个数据库列来支持新的Rails 5属性,ruby-on-rails,postgresql,ruby-on-rails-5,Ruby On Rails,Postgresql,Ruby On Rails 5,我正在考虑使用新的自定义数据类型,理想情况下将数据存储在两个数据库列中,一个用于数据值,另一个用于一些额外的类型信息 Attributes API似乎设计为只处理一个数据库列,我想知道是否缺少使用两个列的方法 例子 想象一个Money对象,其中一个十进制或整数列表示值,一个字符串列表示货币代码。我将传入我的自定义货币对象,将其存储为两列,然后将其读回,将这两列合并为货币对象 我曾考虑将值和货币序列化到单个Postgres JSON列中,但我希望能够仅对值列执行快速SQLSUM查询和排序,因此这似
值
,另一个用于一些额外的类型
信息
Attributes API似乎设计为只处理一个数据库列,我想知道是否缺少使用两个列的方法
例子
想象一个Money对象,其中一个十进制
或整数
列表示值,一个字符串
列表示货币代码。我将传入我的自定义货币对象,将其存储为两列,然后将其读回,将这两列合并为货币对象
我曾考虑将值和货币序列化到单个Postgres JSON列中,但我希望能够仅对值列执行快速SQLSUM
查询和排序,因此这似乎并不理想
提前感谢您提供的任何见解。很遗憾,我无法直接回答您的问题,但您的例子让我思考了一下。money rails gem允许使用单独的货币列。也许值得一探究竟,看看他们在幕后做些什么 我猜您正在考虑在您的模型中创建一个 这是没有理由的。例如:
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
class客户6}
def初始化(金额、币种=“美元”)
@金额,@币种=金额,币种
结束
def兑换至(其他货币)
兑换金额=(金额*汇率[“{货币}{对{其他货币}]”)
新货币(兑换金额、其他货币)
结束
def==(其他费用)
金额==其他货币。金额和货币==其他货币。货币
结束
def(其他资金)
如果货币==其他货币
其他金额
其他的
金额其他货币。兑换成(货币)。金额
结束
结束
结束
是的,我们的想法是一样的。实际上,我已经为我当前的代码复制了它们现有的实现,这基本上只是覆盖了getter和setter。现在Rails 5有了一个官方的属性API,我想我应该试一试。我搜索了money-rails
gem-GH问题,但找不到任何关于新属性API的话题。哇,是的。聚合看起来很棒。我会拿着这些到处看看,然后在这里报告。谢谢:)谢谢你。它不完全适合我的用例(我需要使用模型中已有的数据对写操作执行大量类型强制),因此我最终继续使用自己的getter和setter。但这绝对是一个很好的答案,我学到了下一次的新技巧。