0

私はTripSpendingという2つのモデルを持っていますが、これらは関連付けられていませんが、どちらもuser_idです。アソシエーションのない2つのテーブルからのアクティブレコードの取得

TripSpending => idareauser_idamount

例データにTrip =>idareauser_iddistance

  • 列に

    • 列での

      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)amountareadistancesum、例えば:

      area amount distance 
      AK 200  30 
      CA  60  40 
      

      2)およびdistanceuserであり、areaである。 user_id = 2のために:

      area amount distance 
      AK 170  10 
      CA  0  10 
      

      私は別にTripSpendingからレコードを取得することができますし、Rubyで操作するが、それは私にとって非常にきれいに見えません。私はjoinsを使ってみましたが、レコードは重複しています。

      ActiveRecordクエリを作成する際の助けがあれば幸いです。ありがとう。

      注:私はモデルを簡略化し、この質問の他の列とリレーションを除外しました。私は私のプロジェクトでエリアのための別のモデルを作成するオプションがありません。

  • 答えて

    0

    データが非正規化されていますが、このようなことができますか?この方法で作業する方が簡単かもしれません。

    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、:支出)'のようなものを試しましたが、不正な値を返す – Aitizazk

    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) 
    

    UPDATE: 要件ごとに、あなたはUserAreaモデルを置き換えることができます。ここでは次のようになります:

    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? 'にチェインの.includesがありますか?私はそれをテストしなかったが、これはあなたが探しているロジックのタイプのように私に見えます。 p.s.これはいい答えです@Anand Soni – dps

    +0

    私はそれが私の状況では不可能な「エリア」のための別個のモデルを作成するという考えに基づいています。 – Aitizazk

    関連する問題