2012-02-15 7 views
1

ユーザーモデルとブックモデルを使用して、追加の属性を含む結合モデルViewedBookを作成しました。以下は私が思いついたものの本質です: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に限られているので、これを管理し効率的なクエリを生成するためのエレガントな方法があるようですが、このシナリオを明確にする例はまだありません。

EDIT:は、私は自分自身が終了した本に限定されることはありません探している他のクエリを明確にするために、私はそれが与えられた本のために存在する場合、各ブックに追加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

ありがとう、ブラッドリー!私はちょうど私が必要とするものを行うかもしれないと思う。私は今日これを後で検証します。 –

+0

このアプローチでは、悲しいことに内部結合が生成されるため、関連付けられたbook_viewingを持つブックに結果が制限されます。元の質問を明確にして、ほとんどのクエリに対して左結合が必要であるという事実を含めるようにしました。 –

関連する問題