2015-05-31 34 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