2012-02-15 81 views
1

給定用戶和書籍模型,我創建了一個包含附加屬性的聯接模型,包含了PerspectiveBook。下面是我想到的內容:使查詢結果中可用的ActiveRecord聯接模型屬性

create_table "users" 
    t.string "username" 
end 

create_table "books" 
    t.string "title" 
    t.integer "user_id" 
    t.date "authored_date" 
end 

create_table "books_viewings" 
    t.integer "book_id" 
    t.integer "user_id" 
    t.boolean "finished" 
    t.date "last_viewed_date" 
end 

class User 
    belongs_to :book_viewing 

    has_many :authored_books, 
       :class_name => "Book", 
       :source => :book 

    has_many :book_viewings 

    has_many :viewed_books :through => :book_viewings 
       :order => "book_viewings.last_viewed_date DESC" 

    has_many :finished_books :through => :book_viewings 
       :conditions => "book_viewings.finished = TRUE", 
       :order => "book_viewings.last_viewed_date DESC" 
end 

class Book 
    belongs_to :user 
    has_one :author, :class_name => "User" 
end 

class BookViewing 
    belongs_to :book 
    belongs_to :user 
end 

我認爲這適用於我需要創建的大多數查詢。不過,我希望user.viewed_books返回的每個Book對象也包含finished屬性。此外,我還會添加其他查詢,例如Book.best_sellers,我也希望將其範圍擴展到給定的用戶,以便他們還包含完成的屬性。

從我對ActiveRecord的有限接觸中,似乎可能有一種優雅的方式來管理這個並生成高效的查詢,但我還沒有找到一個可以說明這種情況的例子。

編輯:澄清,我正在尋找自己不會僅限於已完成圖書的其他查詢,但我需要有finished屬性附加到每一本書,如果它存在,對於給定的書和book_viewings中的作用域用戶。

回答

2

看到這裏我的答案https://stackoverflow.com/a/8874831/365865

差不多,沒有沒有做到這一點特定的方式,但你可以通過一個選擇選項到您的has_many關聯。在你的情況,我會這樣做:

has_many :books, :through => :book_viewings, :select => 'books.*, book_viewings.finished as finished' 
+0

謝謝布拉德利!我認爲這可能正是我所需要的。我會在今天晚些時候進行驗證。 – 2012-02-15 16:27:15

+0

這種方法令人傷心地生成內部聯接,因此將結果限制爲具有關聯book_viewing的書籍。我澄清了最初的問題,以包括我需要大部分查詢都需要左連接的事實。 – 2012-02-16 01:02:21

相關問題