2011-01-12 14 views
1
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 

Ein Benutzer kann viele Bücher schreibt Ein Buch nur einen Benutzer gehört, kann Ein Benutzer ein Leser verschiedenen Bücher sein kann Ein Buch kann von verschiedenen Benutzern gelesen wirdRails 3 Verbände

User.books 

gib mir sollte die Bücher der Benutzer

User.books_read 

geschrieben hat, sollte mir die Bücher geben, werden von diesem Benutzer lesen

Wie erreichen Sie das?

Zweite Frage, was ist die einfachste Methode, book_read vom Benutzer zu löschen? ich meine

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

Antwort

1

Erste Frage:

entweder Sie :source oder :class_name verwenden.

has_many :books_read, :class_name => "Book", :through => :book_users 

Ich weiß nicht sicher, ob :class_name Arbeiten mit has_many :through. Wenn es nicht funktioniert, versuchen Sie Folgendes:

has_many :books_read, :source => :book, :through => :book_users 

Das sollte den Trick tun.

Zweite Frage:

Soweit ich weiß, dass es nicht wirklich eine einfache Methode ist, Bücher aus der books_read Beziehung zu löschen. Sie können Ihre eigene Methode erstellen, um dies zu erreichen. Stellen Sie sicher, dass Sie Datensätze aus :book_users und nicht die has_many :through Beziehung löschen. Andernfalls werden die Bücher selbst gelöscht.

def delete_book(book_id) 
    self.book_users.find_by_book_id(book_id).destroy 
end 

Wenn Rails 3 können Sie sich den find_by_... Helfer nicht verwenden und müssen where verwenden.

def delete_book(book_id) 
    self.book_users.where(:book_id => book_id).destroy 
end 

Jetzt können Sie diese Funktion aufrufen wie folgt:

User.find(1).delete_book(2) 

Ich hoffe, das hilft dir.