假设我有一个用户模型。用户有2个has_many关联,即用户有很多铅笔并且有很多车。汽车和铅笔表具有相同的属性,:日期和单独的如:速度(汽车)和:长度(铅笔)。我想加入用户的铅笔和汽车的共同属性:date,这样我就有了一个数组/关系[:date,:speed,:length]。我如何实现这一点,我尝试了加入和合并,但它们没用。
答案 0 :(得分:1)
存在许多更有效的选项,但这是一种可能的方法:
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
答案 1 :(得分:1)
出于效率的考虑,我肯定会建议将其转换为查询而不是循环。我认为这会奏效:
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)")