2015-10-20 75 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