簡體   English   中英

在公共屬性上加入兩個 ActiveRecord 關聯

[英]Joining two ActiveRecord associations on common attribute

假設我有一個 User 模型。 用戶有 2 個 has_many 關聯,即用戶有很多鉛筆和很多汽車。 Cars 和 Pencils 表具有相同的屬性,:date,並分開,例如 :speed(car) 和 :length(pencil)。 我想加入用戶的鉛筆和汽車的公共屬性,:date,以便我有一個數組/關系 [:date, :speed, :length]。 我如何實現這一點,我嘗試過加入和合並,但沒有用。

存在許多更有效的選擇,但這是一種可能的方法:

class User < ActiveRecord::Base
  def get_merged_array
    dates = (cars.map(&:date) & pencils.map(&:date))
    results = []
    dates.each do |date|
      cars.where(date: date).each do |car| 
        pencils.where(date: date).each do |pencil|
          results << [date, car.speed, pencil.length]
        end
      end
    end
    results
  end
end

為了效率,我絕對建議將其放入查詢而不是循環中。 我認為這會奏效:

Car.joins(:user => :pencils).where("pencils.date = cars.date")

如果您想立即將其減少到數組:

Car.joins(:user => :pencils).where("pencils.date = cars.date").pluck("cars.date", "cars.speed", "pencils.length")

如果您需要包含datenil匹配項,您可能需要添加:

Car.joins(:user => :pencils).where("(pencils.date = cars.date) OR (pencils.date IS NULL AND cars.date IS NULL)")

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM