Rails 3 ассоциации - PullRequest
       0

Rails 3 ассоциации

1 голос
/ 12 января 2011
class User < ActiveRecord::Base
  has_many :books
  has_many :book_users
  has_many :books, :through => :book_users
end

class Book < ActiveRecord::Base
  belongs_to :user
  has_many :book_users
  has_many :users, :through => :book_users
end

Пользователь может написать много книг Книга может принадлежать только одному пользователю Пользователь может быть читателем разных книг Книгу могут прочитать разные пользователи

User.books 

должен дать мне книги, написанные пользователем

User.books_read

должен дать мне книги, прочитанные этим пользователем

Как это сделать?

Второй вопрос, какой самый простой способ удалить book_read у пользователя? Я имею в виду

User.method_name(book_id) # what's the method name ?

1 Ответ

1 голос
/ 12 января 2011

Первый вопрос:

Вы используете :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)

Надеюсь, это поможет вам.

...