Первый вопрос:
Вы используете :source
или :class_name
.
has_many :books_read, :class_name => "Book", :through => :book_users
Я точно не знаю, работает ли :class_name
с has_many :through
. Если это не работает, попробуйте это:
has_many :books_read, :source => :book, :through => :book_users
Это должно сработать.
Второй вопрос:
Насколько я знаю, на самом деле не существует простого способа удаления книг из отношения books_read. Вы можете создать свой собственный метод для достижения этой цели. Просто убедитесь, что вы удаляете записи из :book_users
, а не из отношения has_many :through
. Или сами книги будут удалены.
def delete_book(book_id)
self.book_users.find_by_book_id(book_id).destroy
end
При использовании Rails 3 вы не можете использовать помощник find_by_...
и должны использовать where
.
def delete_book(book_id)
self.book_users.where(:book_id => book_id).destroy
end
Теперь вы можете вызывать эту функцию следующим образом:
User.find(1).delete_book(2)
Надеюсь, это поможет вам.