在公共属性上加入两个ActiveRecord关联

时间:2016-04-23 11:31:50

标签: ruby-on-rails activerecord

假设我有一个用户模型。用户有2个has_many关联,即用户有很多铅笔并且有很多车。汽车和铅笔表具有相同的属性,:日期和单独的如:速度(汽车)和:长度(铅笔)。我想加入用户的铅笔和汽车的共同属性:date,这样我就有了一个数组/关系[:date,:speed,:length]。我如何实现这一点,我尝试了加入和合并,但它们没用。

2 个答案:

答案 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")

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

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