我有三个表:users
,cars
和mechanics
。
关联:
我想找到由特定机械师修理汽车的用户,所以我做了这样的事情:
User.joins(:cars).where('cars.color = ? AND cars.type = ? AND cars.mechanic.name = ?', 'green', 'estate', 'paul')
诀窍是我不知道如何写这个cars.mechanic.name
部分。
答案 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