如何设置Rails以执行以下操作:
我有一个模特类贸易:
symbol of type String
price of type Float
currency of type String
date of type Date
然后我有一个查找表CrossRates
curr_a of type String
curr_b of type String
date of type Date
rate of type Float
表CrossRates有很多行,如下例所示:
EUR USD 2015-03-03 1.3593
假设我有一份交易报告,我想在交易日使用正确的CrossRate。假设交易是以货币USD进行的,我希望以欧元报告。
我应该如何设置模型之间的关系?
我是否必须手动阅读每笔交易的交叉汇率?我想避免使用自定义SQL(使用@result = ActiveRecord :: Base.connection.execute(sql)执行),因为我希望将报表中的行表示为:
trade.price * xrate
但我不确定如何获得“xrate”。我可以用哈希预加载整个表,然后用
查找crossrates["EUR"]["USD"]["2015-03-03].rate
但这似乎是一个尴尬的解决方案......
编辑:
这个查询做了我想要的,但它并不完全是“Railsy”......
SELECT
t.SYMBOL as 'symbol',
DATE(trade_time) as 'date',
price*-qty*p.contract_size,
p.currency,
cr.ratio
FROM
alpha.trades t, products p, crossrates cr
WHERE
t.symbol = p.symbol and t.dt = "2015-03-03" and cr.dt = "2015-03-03" and
cr.currency_a = p.currency and cr.currency_b = "SEK"
ORDER BY
SYMBOL, DATE(trade_time)
如何使用模型来表达上述内容?
我认为下面这个问题的接受答案接近我想要的,但我不明白更精细的细节......
class User < AR
has_many :friends
def self.who_knows(*friend_names)
joins((1..friend_names.length).map{ |n|
"INNER JOIN friends AS f#{n} ON users.id = f#{n}.user_id AND f#{n}.name = ?" }.join(" "),
*friend_names)
})
end
end
然后你可以这样打电话:
@users = User.who_knows("Joe", "Jack")
答案 0 :(得分:0)
一种方法是不加入这两个表,将它们视为单独的模型。
在交易模型中,您拥有交易的currency
和所需的cross_rate
。
在您的交易模型中,包括以下方法。
def get_cross_rate_report_for cross_rate
xrate = CrossRate.where("curr_a == ? and curr_b == ?", currency, cross_rate).first().rate
r = trade.price * xrate
# add pretty print code here
end
请注意,我还没有对此进行测试,关键是where条件,它允许您按两列过滤结果并返回CrossRate模型,然后您可以在其上请求速率。请参阅here
为了加快查找速度,我会将索引添加到CrossRate表中。查看here以获取指导和示例代码(ctrl-f和搜索&#39;索引&#39;)。