Для моделей User и Book я создал модель соединения ViewedBook, которая содержит дополнительные атрибуты.Ниже суть того, что я придумал:
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
Я думаю, что это работает для большинства запросов, которые мне нужно создать.Однако я хочу, чтобы каждый из объектов Book, возвращаемых user.viewed_books
, также включал атрибут finished
.Кроме того, у меня будут дополнительные запросы, такие как Book.best_sellers
, которые я также хотел бы охватить заданным пользователем, чтобы они также включали готовый атрибут.
Из-за моего ограниченного доступа к ActiveRecord кажется, что, вероятно, элегантныйспособ управлять этим и генерировать эффективные запросы, но мне еще предстоит найти пример, который проясняет этот сценарий.
РЕДАКТИРОВАТЬ: , чтобы уточнить, другие запросы, которые я ищу, сами не будутбыть ограниченным книгами, которые были закончены, но мне нужно, чтобы к каждой книге добавлялся атрибут finished
, если он существует для данной книги и пользователя с областью действия в book_viewings.