活动记录从两个没有关联的表中获取结果

时间:2017-05-17 19:04:00

标签: ruby-on-rails ruby ruby-on-rails-4 activerecord postgresql-9.1

我有两个模型TripSpending,它们没有任何关联,但它们都有user_id

  • Trip =>上的列idareauser_iddistance

  • Spending =>上的列idareauser_idamount

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

我可以分别从TripSpending获取记录并使用ruby进行操作,但这对我来说并不是很干净。我尝试过使用joins,但记录是重复的。

有关构建ActiveRecord查询的任何帮助都将受到高度赞赏。谢谢。

注意: 我简化了模型并排除了这个问题的其他列和关系。所以我没有选择在我的项目中为区域创建另一个模型。

2 个答案:

答案 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) ] }

希望这有帮助!