gpt4 book ai didi

mysql - 如何在 Rails 中表达多表连接

转载 作者:行者123 更新时间:2023-11-29 00:03:24 27 4
gpt4 key购买 nike

我的查询看起来(有点)像这样:

SELECT
t.strategy_id, SUM(t.price*t.qty), p.currency
FROM
trades t, products p
WHERE
t.symbol = p.symbol and
(DATE(trade_time) > '2015-01-01' and DATE(trade_time) < DATE(NOW()))
GROUP
BY t.strategy_id, SYMBOL, DATE(trade_time) WITH ROLLUP

我如何在“Rails-y”中最好地表达这一点?由于结果是来自两个表的字段的复合,我应该创建一个模型 StrategyPnl 吗?它应该派生自 ActiveRecord::Base 吗?可能不是,因为没有 table ,或者......?

顺便说一句,我没有这些表之间的关联,这是一项要求吗?

我想写这样的东西:

stratpnl.select().where().group()....

并获取这个新类/模型的数组,但我不知道该怎么做?

*************************** 编辑 ********************* ******

我只是在回答这个问题,因为实际的表格在这个问题中并不重要:

假设两个表 A 和 B 没有任何关系(FK 或其他)

SELECT A.FIELD_Y, B.FIELD_X
FROM A,B
WHERE A.INTEGER_X > B.INTEGER_Y
GROUP BY A.NAME

有什么方法可以用漂亮的模型在 Rails 中表达这个查询吗?我知道我可以做到这一点:

@result = ActiveRecord::Base.connection.execute(sql)

但这只会给我一个二维字段数组,我更愿意使用 ActiveRecords 功能并引用对象和字段,因为它在那里。

最佳答案

在不知道正确的模型关系的情况下,您可以使用 ActiveRecord 执行以下操作:

strategies_data = \
Trade. # assuming at least one table has an associated model
joins("INNER JOIN products ON products.symbol = trades.symbol").
where("DATE(trade_time) BETWEEN ? AND ?", Date.new(2015, 1, 1), Date.today).
group("trades.strategy_id, trades.symbol, DATE(trade_time) WITH ROLLUP").
select("trades.strategy_id AS id,
SUM(trades.price*trades.qty) AS strategy_price,
products.currency AS currency")

然后:

sd = strategies_data.first
sd.id #=> gives you strategy_id
sd.strategy_price #=> gives you total price
sd.currency #=> gives you the currency

稍微调试一下,应该可以。

更新:

如果您还希望事情在语义上也是正确的(就类而言),如果您不介意放慢速度,请添加此步骤:

strategy_columns = %i{id strategy_price currency}
strategy_struct = Struct.new(*strategy_columns)
strategies = \
strategies_data.map do |sd|
attributes = \
strategy_columns.each_with_object({}) do |attr, hash|
hash[attr] = sd.public_send(attr)
end

strategy_struct.new(attributes)
end

关于mysql - 如何在 Rails 中表达多表连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28671845/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com