Запрос косвенной связи

У меня есть приложение, в котором есть пользователи, библиотеки и книги.

Пользователи имеют множество библиотек. В библиотеках много Пользователей и Книг. Но Пользователи и Книги не имеют прямого отношения. Пользователи могут брать книги только из библиотек.

Я застрял, пытаясь получить коллекцию книг, принадлежащую библиотекам, членом которых является пользователь. Другими словами, я хочу получить все книги в библиотеке, к которой принадлежит данный пользователь.

Чтобы было ясно, я не хочу проходить через ассоциацию заимствования, которая в настоящее время существует между пользователями и книгами, потому что мне нужны все книги в этой библиотеке, а не только те, которые в настоящее время заимствованы пользователем.

Я часами пытался придумать этот запрос, используя SQL и Squeel, но безуспешно... заранее спасибо за вашу помощь.


person zapatos    schedule 31.05.2015    source источник


Ответы (1)


Вы можете сделать что-то вроде этого...

Book.where(:library_id => user.library_ids)

Или вы можете сделать это. При такой настройке модели...

class Book < ActiveRecord::Base
  belongs_to :library

class Library < ActiveRecord::Base
  has_many :books
  has_many :memberships
  has_many :users, :through => :memberships

class User < ActiveRecord::Base
  has_many :memberships
  has_many :libraries, :through => :memberships
  has_many :books, :through => :libraries

При этом вы можете запросить @user.books, который в Rails сгенерирует SQL, например:

# 1 is @user.id
SELECT "books".* FROM "books" INNER JOIN "libraries" ON "books"."library_id" = "libraries"."id" INNER JOIN "memberships" ON "libraries"."id" = "memberships"."library_id" WHERE "memberships"."user_id" = 1  
person Mark Swardstrom    schedule 31.05.2015