2015-10-20 37 views
1

的关联搜索时发现记录我有三个表:userscarsmechanics的Rails如何在关联

协会:

  • 用户的has_many车,汽车属于用户
  • 车belongs_to的技工,machanic的has_many汽车

我想找个有车通过特定的机械修理的用户,所以我在做这样的事情:

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

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

回答

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

尝试,这可能是这会工作。

+0

我只能添加使用'merge'的可能性,因此可以使用范围太:'.merge(技工。哪里(名字:'paul'))'。 –

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 
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