Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 有没有办法用两个数据库列来支持新的Rails 5属性_Ruby On Rails_Postgresql_Ruby On Rails 5 - Fatal编程技术网

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列中,但我希望能够仅对值列执行快速SQL
SUM
查询和排序,因此这似乎并不理想


提前感谢您提供的任何见解。

很遗憾,我无法直接回答您的问题,但您的例子让我思考了一下。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。但这绝对是一个很好的答案,我学到了下一次的新技巧。