Приведенные модели пользователей и книг, я создал модель соединения, 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
Я думаю, что это работает для большинства запросов, мне нужно создать. Тем не менее, я хочу, чтобы каждый объект Book возвращался user.viewed_books
, чтобы включить атрибут finished
. Кроме того, у меня появятся дополнительные запросы, такие как Book.best_sellers
, что также я хотел бы использовать область для данного пользователя, чтобы они также включали законченный атрибут.
Из-за моей ограниченной экспозиции ActiveRecord, похоже, есть элегантный способ управлять этим и генерировать эффективные запросы, но мне еще предстоит найти пример, который проясняет этот сценарий.
EDIT: уточнить, другие вопросы я ищу сам по себе не ограничиваются книгами, которые были закончены, но мне нужно, чтобы иметь атрибут finished
приложенных к каждой книге, если она существует для данной книги и пользователь с областью действия в book_viewings.
Спасибо, Брэдли! Я думаю, что я могу сделать именно то, что мне нужно. Я проверю это позже сегодня. –
Этот подход печально генерирует внутреннее соединение, поэтому ограничивает результаты теми книгами, которые связаны с book_viewing. Я уточнил исходный вопрос, включив тот факт, что мне нужно левое соединение для большинства моих запросов. –