2015-05-31 3 views
2

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

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

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

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

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

ответ

2

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

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 
2
Table_User 
user_id user_name library_id membership_id 

Table_Library 
library_id user_id book_id membership_id 

Table_Books 
books_id book_name library_id 


Table_Membership 

membership_id user_id library_id 

select book_name from Table_Books 
inner join Table_Library on Table_Books.library_id=Table_Library.library_id 
inner join Table_User on Table_User.library_id=Table_Library.library_id 
where Table_User.library_id = Table_Membership.library_id 
and Table_User.user_id =Table_Membership.user_id