![](/img/trans.png)
[英]RoR Activerecord: joining query with two associations that share a model
[英]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")
如果您需要包含date
為nil
匹配項,您可能需要添加:
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.