Rails - 如何使用“has_many”关联创建一个条件?

时间:2014-11-10 22:07:28

标签: ruby-on-rails ruby activerecord has-many

我有这两个模型:

class Car < ActiveRecord::Base
  has_many :colors
end

颜色

class Color < ActiveRecord::Base
  belongs_to :car
end

每辆车都有很多颜色。 我想做的是 - 取出所有没有黑色的汽车。

使用ActiveRecord在一个查询中有没有办法做到这一点?我可以这样做:

@cars = Car.where('brand = ?', params[:car])
@cars.each do |car|
  car.colors.each do |color|
    ...test that the color is not black...
  end
end

但是这个方法有点慢......用一个查询做一个更快的方法吗?

谢谢

2 个答案:

答案 0 :(得分:0)

我们不知道您的Color型号的属性,但是您正在寻找的是这样的:

@cars = Car.where('brand = ?', params[:car])
@cars = @cars.joins(:colors)
             .where("colors.name <> 'black'").each do |car|

或者,如果您使用的是Rails 4:

@cars = Car.where('brand = ?', params[:car])
@cars = @cars.joins(:colors)
             .where.not(colors: { name: :black }).each do |car|

答案 1 :(得分:0)

试试这个

Car.joins(:colors).where("colors.name <> 'black'").group('cars.id')

更新:

您可以在两个查询中执行此操作

black_car_ids = Color.where(:name => 'black').pluck('DISTINCT car_id')
@cars = Car.where("id not in (?)", black_car_ids).where('brand = ?', params[:car])