Rails在搜索关联关联时如何查找记录

时间:2015-10-20 11:26:10

标签: ruby-on-rails activerecord

我有三个表:userscarsmechanics

关联:

  • 用户has_many汽车,汽车属于用户
  • car belongs_to mechanic,machanic has_many cars

我想找到由特定机械师修理汽车的用户,所以我做了这样的事情:

User.joins(:cars).where('cars.color = ? AND cars.type = ? AND cars.mechanic.name = ?', 'green', 'estate', 'paul')

诀窍是我不知道如何写这个cars.mechanic.name部分。

3 个答案:

答案 0 :(得分:2)

User
  .joins( :cars => :mechanic )
  .where( :cars     => {:color => "green", :type => "estate"}, 
          :mechanic => {:name => "paul"} ) 

试试这可能会有效。

答案 1 :(得分:0)

您还需要加入mechanic,然后就可以查询:

q = User.joins(cars: :mechanic)
q = q.where('cars.color = ? and cars.type = ?', 'green', 'estate')
q = q.where('mechanics.name = ?', 'paul')

您需要注意,因为您可能会返回多个User个实例。如果用户在此示例中有两辆汽车(两个绿色庄园),则该查询将返回两次。你可能想要在查询中添加一个distinct,以便只返回一次用户,无论他们有多少绿色庄园可能参加。

q = q.distinct

答案 2 :(得分:0)

可以使用选项扩展关联 has_many ,有关详细信息,请参阅API docs。特定于您的问题汽车模型属于用户和机械师,所以这应该可以帮助您:

class User < ActiveRecord::Base
  has_many :cars
  has_many :mechanics, through: :cars
end


class Mechanic < ActiveRecord::Base
  has_many :cars
  has_many :users, through: :cars
end


class Car < ActiveRecord::Base
  belongs_to :user
  belongs_to :mechanic
end


class MechanicsController < ActionController::Base
  def show
    @mechanic = Mechanic.find_by(name: params[:name])
    @users    = @mechanic.users.includes(:cars)
  end
end