2010-09-17 3 views
6

Rails Neuling ... versuchen, die richtige Art und Weise zu verstehen, Dinge zu tun ...Rails 3, wie eine dazugehörige Datensatz hinzufügen, nachdem eine primäre Datensatz erstellt (Bücher, Auto Add BookCharacter)

In meinen App-Benutzern erstellen Ein Buch (ich habe das funktioniert)

Was ich geschehen möchte, ist, wenn ein Benutzer ein Buch erstellt, ein Datensatz der BookCharacters-Tabelle hinzugefügt wird, so etwas wie (id, book.id, user.id, characterdescription.string .)

Wenn das Buch erstellt wird, sollte der Benutzer, der es erstellt hat, automatisch als erster BookCharacter hinzugefügt werden. Danach kann der Benutzer beliebig viele BookCharacters manuell hinzufügen/bearbeiten. Aber zuerst möchte ich, dass sie standardmäßig automatisch hinzugefügt werden.

Also in meinem Buch Controller ich habe:

def create 
@book = Book.new(params[:book]) 
respond_to do |format| 
    if @book.save 
.... 

Mit Rails ist es die Praxis, diese Art von Logik hinzuzufügen, nachdem das Buch gespeichert? So etwas wie

Book.create(:creator => current_user.id) 

Ich schätze die Hilfe

Antwort

16

Die wichtige Sache der Konvention durch die zu verstehen ist, Rails implementiert Beziehungen Active mit . Ein Buch hat viele Zeichen, und jedes Zeichen gehört zu einem Buch, so:

class Book < ActiveRecordBase 
    has_many :characters 
end 

class Character < ActiveRecordBase 
    belongs_to :book 
end 

Rails geht nun davon aus, dass die characters Tabelle einen Fremdschlüssel book_id genannt hat, die auf die books Tabelle festlegt. So erstellen Sie einen Charakter, die zu einem Buch: Jetzt

@book = Book.new(:name=>"Book name") 
@character = @book.characters.build(:name=>"Character name") 

wenn @book gespeichert wird (vorausgesetzt, beide @book und @character sind gültig), wird eine Zeile in erstellt werden, um sowohl die books und die characters Tabellen, mit der Zeichenzeile verknüpft durch book_id.

Um zu zeigen, dass ein Zeichen zu einem Benutzer gehört auch, könnte man diese Beziehung zu dem Charakter Modell hinzu:

class Character < ActiveRecordBase 
    belongs_to :book 
    belongs_to :user 
end 

So characters Rails erwartet nun auch Fremdschlüssel user_id genannt zu haben, die users einen Punkt Tabelle (die auch ein User Modell benötigt). Um den Benutzer angeben, wenn das Zeichen zu erstellen:

@book = Book.new(:name=>"Book name") 
@character = @book.characters.build(:name=>"Character name",:user=>current_user) 

Sie können auch die Fremdschlüssel zuweisen, indem Sie die entsprechende Methode für das Objekt aufrufen:

@character.user = current_user 

Das alles funktioniert, weil es die Rails Konventionen folgt für die Benennung Modelle und Tabellen. Sie können von diesen Konventionen abweichen, aber Sie werden es schwerer haben, Rails zu lernen, wenn Sie dies tun.

+0

Das ist die beste Antwort, die ich je gesehen habe. Danke, dass Sie mir geholfen haben, den richtigen Weg zu kennen, um Rails zu benutzen – AnApprentice

+0

Hallo danke @zetetic - wenn ich zwei Modelle habe, die miteinander verwandt sind, dann muss ich, wenn ich eine Instanz der ersten erzeuge, manuell eine Instanz der zweiten erstellen und verbinden sie zusammen in der Steuerung, anstatt Schienen erstellen automatisch den zweiten Datensatz bei der Erstellung der ersten -> ist das die Schiene Konvention? Chrs – BKSpurgeon

0

ich lieber etwas wie (wenn Benutzer has_many Buch):

def create 
@book = current_user.books.new(params[:book]) 
respond_to do |format| 
    if @book.save 
    … 
+0

Danke, aber meine Frage war über das Erstellen von BookCharacters ... Vielleicht kann ich bearbeiten, um das besser zu klären? – AnApprentice

+0

Ja, mein Fehler.Tolle Antwort von @zetetic! – Yannis