有效的记录从两个表中获取结果无关联

问题描述:

我有两个模型TripSpending,他们没有关联,但他们都有user_id。上有效的记录从两个表中获取结果无关联

  • Trip =>idareauser_id,上Spending =>id,在Tripareauser_idamount

实施例数据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)的amountsumdistancearea,例如:

    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 
    

    我可以从TripSpending获得单独记录和红宝石操作,但这并不看起来很干净的我。我曾尝试使用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 
    
    +0

    实际上,我已简化了模型并排除了此问题的其他列和关系。这两个模型属于一个用户,我尝试了一些像'user.joins(:trips,:spendings)'但它返回不正确的值 – Aitizazk

    我同意@ 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) ] } 
    

    希望这有助于!

    +0

    正如我在前面的评论中所说,我简化了模型并排除了其他列和关系题。这两个模型属于一个用户,我尝试了一些像user.joins(:trips,:spendings)但它返回不正确的值 – Aitizazk

    +0

    @Aitizazk你在这个答案中看到了Group by Query?链接的包含吗?我没有测试它,但它看起来像这是你正在寻找的逻辑类型。附:这是一个很好的答案@Anand Soni – dps

    +0

    正如我所说的,它是基于这样一个想法,即我为Area创建了一个独立的模型,在我的情况下 – Aitizazk