2015-11-26 1 views
0

У меня есть следующие модели:Rails mysql: Как запрашивать таблицы с глубоко вложенными отношениями (has_many и belongs_to)?

class User < ActiveRecord::Base 
    has_many :keys 
end 

class Key < ActiveRecord::Base 
    belongs_to :room 
end 

class Room < ActiveRecord::Base 
    belongs_to :building 
end 

class Building < ActiveRecord::Base 
    #Has column "name" 
end 

Я хочу, чтобы все пользователи, имеющие ключи, принадлежащие к зданию с названием «HQ»

Bassicaly что-то вроде этого (псевдо запроса):

Users = users.where('keys.room.building.name=?', name) 

Это дальше я получил:

users = User.joins(:keys).where('keys.room.building.name=?', name) 

Bu т дает следующее сообщение об ошибке:

ActionView::Template::Error (Mysql2::Error: You have an error in your SQL syntax; 
check the manual that corresponds to your MySQL server version for the right syntax to use near '.name='HQ')' at line 1: 
SELECT `users`.* FROM `users` INNER JOIN `keys` ON `keys`.`user_id` = `users`.`id` WHERE (keys.room.building.name='HQ')): 

ответ

1

Дайте этому выстрел

User.joins(keys: [room: :building]).where("buildings.name" => name) 
1

Попробуйте это: -

User.joins(:keys => {:room => {:building}}).where("buildings.name" => name) 

Предполагая, что вы также хотите нетерпеливую нагрузку избежать 1 + N запросов:

User.includes(:keys => {:room => {:building}}).where("buildings.name" => name) 

Надеюсь, это полезно для вас!

+0

Привет, в чем разница между «User.joins (: keys => {: room => {: building}})» и аннонсом lusketeer: «User.joins (keys: [room:: building])»? – MeesterPatat

+0

@MeesterPatat взгляните на эту статью [включает vs joins] (http://blog.bigbinary.com/2013/07/01/preload-vs-eager-load-vs-joins-vs-includes.html) – lusketeer

+0

Я имел в виду, какова разница между использованием фигурных скобок и квадратных скобок. – MeesterPatat

Смежные вопросы