2016-07-28 6 views
0

Ich habe Ruby auf Schienen von Coursera gelernt und bin speziell im Eins-zu-eins-Assoziationsmodul. Ich habe versucht, das Eins-zu-Eins-Assoziationsbeispiel im Tutorial auf meinem eigenen System zu emulieren, aber ich erhalte den ActiveRecord :: RecordInvalid-Fehler. Dies ist, was ich habe diesen Punkt zu erreichen getan:Rails Create Methode Validation Fehler mit eins zu eins Assoziation

1) Schienen g Modell Person first_name 2) rake db last_name: wandern 3) Schienen g Modell personal_info Höhe: float Gewicht: float Person verweist 4) rake db : migrieren 5) Migration 20160725143537_create_people.rb hat den folgenden Code:

class CreatePeople < ActiveRecord::Migration[5.0] 
def change 
    create_table :people do |t| 
    t.string :first_name 
    t.integer :age 
    t.string :last_name 
    t.timestamps 
    end 
end 
end 

6) Migration 20160727184247_create_personal_infos.rb den folgenden Code hat: -

class CreatePersonalInfos < ActiveRecord::Migration[5.0] 
    def change 
    create_table :personal_infos do |t| 
     t.float :height 
     t.float :weight 
     t.references :person, foreign_key: true 

     t.timestamps null: false 
    end 
end 

Ende

7) Der Code in person.rb ist wie folgt:

class Person < ApplicationRecord 
    has_one :personal_info 
end 

8) Der Code in personal_info.rb ist wie folgt: -

class PersonalInfo < ApplicationRecord 
    belongs_to :person 
end 

9) Der Code in seeds.rb ist wie folgt: -

Person.destroy_all 

Person.create! [ 
{first_name: "Kalman", last_name: "Smith", age: 33, login: "kman", pass: "abc123"}, 
{first_name: "John", last_name: "Whatever", age: 27, login: "john1", pass: "123abc"}, 
{first_name: "Michael", last_name: "Smith", age: 15, login: "mike", pass: "not_telling"}, 
{first_name: "Josh", last_name: "Oreck", age: 57, login: "josh", pass: "password1"}, 
{first_name: "John", last_name: "Smith", age: 27, login: "john2", pass: "no_idea"}, 
{first_name: "Bill", last_name: "Gates", age: 75, login: "bill", pass: "windows3.1"}, 
{first_name: "LeBron", last_name: "James", age: 30, login: "bron", pass: "need more rings"},] 

10) Jetzt gehe ich auf die Schienen Konsole (Schienen c) und geben Sie den folgenden : pi1 = PersonalInfo.create! (Höhe: 6.2, Gewicht: 220.0). Dies ist, wenn ich erhalte den oben genannten Fehler, der wie folgt aussieht:

irb (main): 002: 0> PI1 = PersonalInfo.create! (Höhe: 6.2, Gewicht: 220,0)

(0.0ms) begin transaction 
(0.0ms) rollback transaction 
    ActiveRecord::RecordInvalid: Validation failed: Person must exist 
    from C:/RailsInstaller/Ruby2.2.0/lib/ruby/gems/2.2.0/gems/activerecord-5.0.0/lib/active_record/validations.rb:78:in `raise_validation_error' 
    from C:/RailsInstaller/Ruby2.2.0/lib/ruby/gems/2.2.0/gems/activerecord-5.0.0/lib/active_record/validations.rb:50:in `save!' 
    from C:/RailsInstaller/Ruby2.2.0/lib/ruby/gems/2.2.0/gems/activerecord-5.0.0/lib/active_record/attribute_methods/dirty.rb:30:in `save!' 
    from C:/RailsInstaller/Ruby2.2.0/lib/ruby/gems/2.2.0/gems/activerecord-5.0.0/lib/active_record/transactions.rb:324:in `block in save!' 
    from C:/RailsInstaller/Ruby2.2.0/lib/ruby/gems/2.2.0/gems/activerecord-5.0.0/lib/active_record/transactions.rb:395:in `block in with_transaction_returning_status' 
    from C:/RailsInstaller/Ruby2.2.0/lib/ruby/gems/2.2.0/gems/activerecord-5.0.0/lib/active_record/connection_adapters/abstract/database_statements.rb:232:in `block in transaction' 
    from C:/RailsInstaller/Ruby2.2.0/lib/ruby/gems/2.2.0/gems/activerecord-5.0.0/lib/active_record/connection_adapters/abstract/transaction.rb:189:in `within_new_transaction' 
    from C:/RailsInstaller/Ruby2.2.0/lib/ruby/gems/2.2.0/gems/activerecord-5.0.0/lib/active_record/connection_adapters/abstract/database_statements.rb:232:in `transaction' 
    from C:/RailsInstaller/Ruby2.2.0/lib/ruby/gems/2.2.0/gems/activerecord-5.0.0/lib/active_record/transactions.rb:211:in `transaction' 
    from C:/RailsInstaller/Ruby2.2.0/lib/ruby/gems/2.2.0/gems/activerecord-5.0.0/lib/active_record/transactions.rb:392:in `with_transaction_returning_status' 
    from C:/RailsInstaller/Ruby2.2.0/lib/ruby/gems/2.2.0/gems/activerecord-5.0.0/lib/active_record/transactions.rb:324:in `save!' 
    from C:/RailsInstaller/Ruby2.2.0/lib/ruby/gems/2.2.0/gems/activerecord-5.0.0/lib/active_record/suppressor.rb:45:in `save!' 
    from C:/RailsInstaller/Ruby2.2.0/lib/ruby/gems/2.2.0/gems/activerecord-5.0.0/lib/active_record/persistence.rb:51:in `create!' 
    from (irb):2 
    from C:/RailsInstaller/Ruby2.2.0/lib/ruby/gems/2.2.0/gems/railties-5.0.0/lib/rails/commands/console.rb:65:in `start' 
    from C:/RailsInstaller/Ruby2.2.0/lib/ruby/gems/2.2.0/gems/railties-5.0.0/lib/rails/commands/console_helper.rb:9:in `start' 
    from C:/RailsInstaller/Ruby2.2.0/lib/ruby/gems/2.2.0/gems/railties-5.0.0/lib/rails/commands/commands_tasks.rb:78:in `console' 
    from C:/RailsInstaller/Ruby2.2.0/lib/ruby/gems/2.2.0/gems/railties-5.0.0/lib/rails/commands/commands_tasks.rb:49:in `run_command!' 
    from C:/RailsInstaller/Ruby2.2.0/lib/ruby/gems/2.2.0/gems/railties-5.0.0/lib/rails/commands.rb:18:in `<top (required)>' 
    from bin/rails:4:in `require' 
    from bin/rails:4:in `<main>'irb(main):003:0> 

Ich bin mit Schienen 5. Ich würde wirklich schätzen, dass Sie mir helfen, diesen Fehler zu beheben. Vielen Dank im Voraus

Antwort

0

Sie erhalten eine person_id festlegen müssen:

PersonalInfo.create!(person_id: 1, height:6.2, weight:220.0) 
+0

Vielen Dank für Ihre Hilfe! –

0

Wie Sie in Ihrem CreatePersonalInfos Migration sehen können, die person Referenz hat einen Fremdschlüssel. Dies bedeutet, dass Sie PersonalInfo ohne eine zugehörige Person nicht erstellen können. Sie können es entweder erstellen, indem Sie eine gültige person_id

PersonalInfo.create!(height:6.2, weight:220.0, person_id:1) 

oder durch den Verein auf Person

@person.create_personal_info(height:6.2, weight:220.0) 

bietet Ihnen auch die foreign_key Option in der Migration entfernen können die DB-Level-Beschränkung zu entfernen.

+0

Vielen Dank für Ihre Hilfe! –

+0

Wenn Sie die Antwort hilfreich finden, akzeptieren Sie sie bitte. –

1

Gemäß Ihrer Anforderung haben Sie has_one Zuordnung zwischen Person und PersonalInfo definiert. Der beste Weg zu schaffen PersonalInfo zuerst sollten Sie Person dann PersonalInfo so erstellen, wie:

@person = Person.create!(first_name: "Kalman", last_name: "Smith", age: 33, login: "kman", pass: "abc123") 

Jetzt können Sie PersonalInfo erstellen

@person.personal_info.create(height:6.2, weight:220.0) 

Ich denke, es wäre Ihnen zu helfen. Wenn Sie irgendwelche Bedenken haben, lassen Sie es mich bitte wissen.

+0

Vielen Dank für Ihre Antwort. So in der Kurs Video-Tutorial, das Beispiel, das sie zeigten, dass sie zunächst keine Fremdschlüsselwerte für einen Datensatz und dann setzen Sie diesen Datensatz direkt auf dem Tisch gab es eine Verbindung mit. So zum Beispiel person1 = Person.find_by (first_name: "Bill")! PI1 = PersonalInfo.create (Höhe: 6.2, Gewicht: 220,0) person1.personal_info = pi1 –

+0

Dies ist, was ich habe versucht, genau das zu tun um das Beispiel zu simulieren, das im Tutorial gezeigt wird, aber stellen Sie fest, dass in Rails 5, um keine Fremdschlüsselwerte zu haben, wir optional: true neben der Anweisung overs_to in der entsprechenden Klasse hinzufügen müssen. Dies ist, was ich getan habe, obwohl Sie Recht haben, weil es sinnvoller ist, nur an der Fremdschlüssel-Constraint zu halten und den Eltern-Klassen-Datensatz zuerst zu erstellen und dann seine Referenz im Kind-Klassen-Datensatz zu erstellen. Vielen Dank noch mal! –