2016-07-28 26 views
0

我一直在使用Coursera學習ruby,特別是在一對一到一對一的關聯模塊中。我試圖在我自己的系統教程中模擬一對一的關聯示例,但是我得到ActiveRecord :: RecordInvalid錯誤。這就是我所做的一切達到這一點:Rails使用一對一的關聯創建方法驗證錯誤

1)軌道G型人LAST_NAMEFIRST_NAME您好 2)耙分貝:遷移 3)軌道G型的personal_info高度:浮體重:浮法人引用 4)耙分貝:遷移 5)遷移20160725143537_create_people.rb具有下面的代碼:

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)遷移20160727184247_create_personal_infos.rb具有下面的代碼: -

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 

7)person.rb的代碼如下:

class Person < ApplicationRecord 
    has_one :personal_info 
end 

8)personal_info.rb的代碼如下: -

class PersonalInfo < ApplicationRecord 
    belongs_to :person 
end 

9)中的代碼在種子.rb如下: -

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)現在我去軌控制檯(導軌c),並鍵入以下內容: pi1 = PersonalInfo.create!(身高:6.2,體重:220.0)。這是當我得到上述錯誤,看起來像這樣:

IRB(主要):002:0> = PI1 PersonalInfo.create!(高度:6.2,重量: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> 

我使用rails 5. 我真的很感激你們幫助我解決這個錯誤。在此先感謝

回答

0

你需要設置一個person_id

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

謝謝你的幫助! –

0

正如你可以在你的CreatePersonalInfos遷移看到,person參考有一個外鍵約束。這意味着如果沒有關聯的Person,您將無法創建PersonalInfo。您可以通過提供有效的person_id

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

或通過協會的人

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

創建它,你也可以刪除你的遷移刪除DB級約束的foreign_key選項。

+0

謝謝你的幫助! –

+0

如果您發現答案有幫助,請接受它。 –

1

根據您的要求,您定義了has_onePersonPersonalInfo之間的關聯。 最好的方式來創建PersonalInfo首先應該創建Person然後PersonalInfo如:

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

現在你可以創建PersonalInfo

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

我認爲這將幫助你。如果您有任何疑問,請告訴我。

+0

非常感謝您的回覆。因此,在coursera視頻教程中,他們展示的例子是,他們最初設置無記錄的外鍵值,然後直接在表格上設置該記錄與之關聯。因此,對於例如, PERSON1 = Person.find_by(FIRST_NAME: 「條例」)! PI1 = PersonalInfo.create(高度:6.2,重量:220.0) person1.personal_info = PI1 –

+0

這是我試圖只是做以模擬教程中顯示的示例,但在rails 5中顯示爲了讓我們需要在適當的類中的belongs_to語句旁添加可選的真值外部鍵值。這是我最終做的,儘管你是對的,因爲只要堅持外鍵約束並首先創建父類記錄,然後在子類記錄中創建它的引用就更有意義了。再一次感謝你! –

相關問題