有效的记录从两个表中获取结果无关联
问题描述:
我有两个模型Trip
和Spending
,他们没有关联,但他们都有user_id
。上有效的记录从两个表中获取结果无关联
列
Trip
=>id
,area
,user_id
,上Spending
=>id
,在Trip
area
,user_id
,amount
实施例数据distance
列:
在点id area user_id distance
1 'CA' 2 10
1 'AK' 3 20
1 'CA' 4 30
1 'AK' 2 10
实施例的数据:
id area user_id Amount
1 'AK' 2 100
1 'AK' 3 30
1 'CA' 4 60
1 'AK' 2 70
我无法找出一种方式来获得以下类型的输出:
1)的amount
sum
和distance
在area
,例如:
area amount distance
AK 200 30
CA 60 40
2)sum
of ,area
的和distance
,为user_id = 2
:
area amount distance
AK 170 10
CA 0 10
我可以从Trip
和Spending
获得单独记录和红宝石操作,但这并不看起来很干净的我。我曾尝试使用joins
,但记录重复。
在构建ActiveRecord
查询任何帮助将得到高度赞赏。谢谢。
注: 我已经简化模型,并排除其他列和关系,为这个问题。所以我没有选择在我的项目中为区域创建另一个模型。
答
你的数据是非规范化的,你能做这样的事情吗?以这种方式工作可能会更容易。
class Area < ApplicationRecord
has_many :spending
has_many :trip
end
class Spending < ApplicationRecord
belongs_to :area
end
class Trip < ApplicationRecord
belongs_to :area
end
答
我同意@ dps的回答,但我想补充一点。这里是我试过的代码:
模型定义:
class Area < ApplicationRecord
has_many :spendings
has_many :trips
end
class Trip < ApplicationRecord
end
class Spending < ApplicationRecord
end
的样本数据
a1 = Area.create(name: "CA")
a2 = Area.create(name: "AK")
u1 = User.first
Spending.create(area_id: a1.id, amount: 100, user_id: u1.id)
Spending.create(area_id: a1.id, amount: 300, user_id: 2)
Spending.create(area_id: a2.id, amount: 200, user_id: u1.id)
Spending.create(area_id: a2.id, amount: 500, user_id: 2)
Trip.create(area_id: a1.id, distance: 10, user_id: u1.id)
Trip.create(area_id: a1.id, distance: 90, user_id: 2)
Trip.create(area_id: a2.id, distance: 20, user_id: u1.id)
Trip.create(area_id: a2.id, distance: 70, user_id: 2)
GROUP BY查询:
Area.includes(:trips).includes(:spendings).group_by{|a| [a.name,a.trips.sum(:distance),a.spendings.sum(:amount) ] }
如果你想单独组的答案,那么你可以试试这个:
Area.includes(:trips).group(:name).sum(:distance)
Area.includes(:spendings).group(:name).sum(:amount)
UPDATE: 按规定,你可以用User
替代Area
模型。在这里它看起来像:
User.includes(:trips).includes(:spendings).group_by{|a| [a.id,a.trips.group(:area_id).sum(:distance),a.spendings.group(:area_id).sum(:amount) ] }
希望这有助于!
实际上,我已简化了模型并排除了此问题的其他列和关系。这两个模型属于一个用户,我尝试了一些像'user.joins(:trips,:spendings)'但它返回不正确的值 – Aitizazk