Ruby on rails 活动记录从两个没有关联的表中获取结果
我有两种型号Ruby on rails 活动记录从两个没有关联的表中获取结果,ruby-on-rails,ruby,ruby-on-rails-4,activerecord,postgresql-9.1,Ruby On Rails,Ruby,Ruby On Rails 4,Activerecord,Postgresql 9.1,我有两种型号Trip和Spending,它们没有关联,但都有用户id 行程=>id,区域,用户id,距离 关于支出=>id,区域,用户id,金额 行程中的示例数据: id area user_id distance 1 'CA' 2 10 1 'AK' 3 20 1 'CA' 4 30 1 'AK' 2 10 支出中的示例数据: id area use
Trip
和Spending
,它们没有关联,但都有用户id
- 行程=>
,id
,区域
,用户id
距离
- 关于
=>支出
,id
,区域
,用户id
金额
行程中的示例数据
:
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) 区域中金额
和距离
的总和
,例如:
area amount distance
AK 200 30
CA 60 40
2) 区域的用户的金额
和距离
的总和
,例如对于用户_id=2
:
area amount distance
AK 170 10
CA 0 10
我可以分别从Trip
和Spending
中获取记录,并用ruby进行操作,但我觉得这并不干净。我曾尝试使用联接
,但记录重复
我们将非常感谢您对构建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
按查询分组:
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)
更新:
根据需要,您可以将区域
模型替换为用户
。在这里,它看起来像:
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)
的方法,但它返回的值不正确,正如我在前面的评论中所说,我简化了模型,并排除了此问题的其他列和关系。这两个模型都属于一个用户,我尝试了一些类似user.joins(:trips,:spendings)的方法,但返回的结果不正确values@Aitizazk您是否看到此答案中分组查询?
上的链接.includes?我没有测试它,但在我看来,这就是你要寻找的逻辑类型。p、 这是一个很好的答案@Anand SoniAs我说这是基于我为区域
创建一个独立模型的想法,这在我的工作中是不可能的situation@Aitizazk,只需将区域替换为用户。我已经更新了我的答案。
User.includes(:trips).includes(:spendings).group_by{|a| [a.id,a.trips.group(:area_id).sum(:distance),a.spendings.group(:area_id).sum(:amount) ] }