Обеспечение доступности атрибутов модели объединения ActiveRecord в результатах запроса - PullRequest
1 голос
/ 15 февраля 2012

Для моделей 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.

1 Ответ

2 голосов
/ 15 февраля 2012

См. Мой ответ здесь https://stackoverflow.com/a/8874831/365865

В значительной степени, нет конкретного способа сделать это, но вы можете передать опцию select вашей ассоциации has_many.В вашем случае я бы сделал это:

has_many :books, :through => :book_viewings, :select => 'books.*, book_viewings.finished as finished'
...