2012-02-15 2 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 

Я думаю, что это работает для большинства запросов, мне нужно создать. Тем не менее, я хочу, чтобы каждый объект Book возвращался user.viewed_books, чтобы включить атрибут 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. Я уточнил исходный вопрос, включив тот факт, что мне нужно левое соединение для большинства моих запросов. –

Смежные вопросы