ユーザーモデルとブックモデルを使用して、追加の属性を含む結合モデル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のスコープ付きユーザー
ありがとう、ブラッドリー!私はちょうど私が必要とするものを行うかもしれないと思う。私は今日これを後で検証します。 –
このアプローチでは、悲しいことに内部結合が生成されるため、関連付けられたbook_viewingを持つブックに結果が制限されます。元の質問を明確にして、ほとんどのクエリに対して左結合が必要であるという事実を含めるようにしました。 –