我有两个模型Trip
和Spending
,它们没有任何关联,但它们都有user_id
。
Trip
=>上的列id
,area
,user_id
,distance
Spending
=>上的列id
,area
,user_id
,amount
Trip
中的示例数据:
id area user_id distance
1 'CA' 2 10
1 'AK' 3 20
1 'CA' 4 30
1 'AK' 2 10
Spending
中的示例数据:
id area user_id Amount
1 'AK' 2 100
1 'AK' 3 30
1 'CA' 4 60
1 'AK' 2 70
我无法找到获得以下类型输出的方法:
1 sum
的{{1}}和amount
中的distance
,例如:
area
2 area amount distance
AK 200 30
CA 60 40
sum
amount
distance
user
area
user_id = 2
:
area amount distance
AK 170 10
CA 0 10
我可以分别从Trip
和Spending
获取记录并使用ruby进行操作,但这对我来说并不是很干净。我尝试过使用joins
,但记录是重复的。
有关构建ActiveRecord
查询的任何帮助都将受到高度赞赏。谢谢。
注意: 我简化了模型并排除了这个问题的其他列和关系。所以我没有选择在我的项目中为区域创建另一个模型。
答案 0 :(得分:0)
您的数据是非规范化的,您可以这样做吗?用这种方式工作可能更容易。
#!/bin/sh
rm ./temp.txt # delete old file before run
while read inputline
do
[[ $inputline == "" ]] && exit 0
echo "$inputline" >> ./temp.txt
done
答案 1 :(得分:0)
我同意@ 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)
按查询分组:
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)
更新:
根据要求,您可以将Area
模型替换为User
。这里看起来像:
User.includes(:trips).includes(:spendings).group_by{|a| [a.id,a.trips.group(:area_id).sum(:distance),a.spendings.group(:area_id).sum(:amount) ] }
希望这有帮助!