2016-04-10 8 views
0

Ich habe zwei Tabellen (d. H. Benutzer und Profile). Das Schema der Tabellen ist:Ruby auf Schienen: Problem mit einer Datenbankeinfügung

create_table "users", force: :cascade do |t| 
    t.string "username" 
    t.string "password_digest" 
    t.datetime "created_at",  null: false 
    t.datetime "updated_at",  null: false 
end 

create_table "profiles", force: :cascade do |t| 
    t.string "gender" 
    t.integer "birth_year" 
    t.string "first_name" 
    t.string "last_name" 
    t.integer "user_id" 
    t.datetime "created_at", null: false 
    t.datetime "updated_at", null: false 
end 

Das Modell ist:

class Profile < ActiveRecord::Base 
    belongs_to :user 
end 

class User < ActiveRecord::Base 
    has_many :todo_lists 
    has_many :many_items, through: :todo_lists, source: :todo_items 
end 

Ich versuche, die Datensätze durch folgende Schritte hinzuzufügen:

user = User.create! username: "Fiorina",password_digest: "abc" 
user_profile = Profile.create! gender:"F",birth_year:"1954",first_name:"Carly",last_name:"Fiorina" 
user_profile.profile = user 

Allerdings erhalte ich die Fehlermeldung:

"NoMethodError: undefinierte Methode` profile = 'für # "

Die Fehlermeldung ist klar.Wie auch immer, ich weiß nicht, wie es zu lösen, d. H. Wie profile Methode zu erstellen. Außerdem lese ich den folgenden Blog und es sagt, dass eine Eins-zu-Eins-Beziehung 4 Methoden erstellen wird. Gibt es trotzdem, dass 4 Methoden erstellt wurden?

http://requiremind.com/differences-between-has-one-and-belongs-to-in-ruby-on-rails/

Antwort

1

Sie benötigen user von user_profile

user_profile.user=user

einzustellen Aber es gibt einen kürzeren Weg, um die gleiche Sache

user.create_profile(gender:"F",birth_year:"1954",first_name:"Carly",last_name:"Fiorina")

Dies wird automatisch erstellt das Profil für diesen Benutzer zu tun.

Sie können auch build_profile verwenden, wenn Sie es nicht wollen an diesem Punkt speichern

class User < ActiveRecord::Base 
    has_one :profile 
    has_many :todo_lists 
    has_many :many_items, through: :todo_lists, source: :todo_items 
end 
1

Sie sollten es ändern:

user_profile.user = user 

nach Ihrem Datenbankfeld und Vereinsnamen.