2014-02-09 2 views
0

У меня есть три модели:has_many Копания нужно свойства через класс

User id, name, ... 
    has_many :user_books 
    has_many :books, through: :user_books 

Books id, name, author 
    has_many :user_books 

UserBooks id, user_id, book_id, has_read, rating 
    belongs_to :user 
    belongs_to :book 

Хорошо, так это установка. Когда я делаю User.books, я получаю сборник книг, но не могу получить доступ к свойствам (book.name, book.author), которые установлены в UserBooks, например has_read, рейтинг и т. Д.

Как читать как Книги, так и UserBooks

+0

дубликат http://stackoverflow.com/questions/18799934/has-many-through-how-do-you-access-join-table-attributes – svoop

+0

, что один не кажется, что работать –

ответ

0

Что вы хотите сделать, это использовать модель объединения, чтобы сделать что-то вроде следующего. В контроллере:

@user_books = @user.user_books.includes(:books) 

(Использование включает предотвращает n+1 queries вопрос, потому что он кэширует книги, необходимые в user_books, в результате чего в течение 2 полных запросов)

Тогда в представлении, вы можете сделать что-то вроде этого :

<%= @user_books.each do |user_book| %> 
    <div class="<%= 'read' if user_book.has_read? %>"> 
    <h2><%= user_book.book.name %> <small>by <%= user_book.book.author %></h2> 
    <span><%= user_book.rating %></span> 
    </div> 
<%= end %> 

Если вы хотите включить методы в книге вы могли бы использовать delegate так:

class UserBook < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :book 

    delegate :has_read, to: :book 
    delegate :author, to: :book 
end 

http://api.rubyonrails.org/classes/Module.html#method-i-delegate

Тогда вы могли бы сделать следующее:

@books = @user.user_books.includes(:books) 

Тогда в силу:

<%= @books.each do |book| %> 
    <div class="<%= 'read' if book.has_read? %>"> 
    <h2><%= book.name %> <small>by <%= book.author %></h2> 
    <span><%= book.rating %></span> 
    </div> 
<%= end %> 

Теперь ПОНИМАЮ, что, хотя мы называем его "Книга" в контроллер и вид, это объект «UserBook».

+0

я на самом деле хотел свойства user_books наряду с книгой в той же переменной, чтобы я мог делать book.name и book.has_read с помощью user_book.book.has_read. Как создать новый объект со свойствами из двух разных объектов –

+0

Проверить обновленный ответ – omarvelous

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