2014-10-11 60 views
-1

如何生成的模型與這些協會:如何在rails4中創建關聯?

Owner 
has_many dogs 

Dog 
belongs_to :owner, has_many :puppies 

Puppy 
belongs_to :dog 

我想:

$ rails generate model Owner name:string 
$ rails generate model Dog name:string owner_id:references 
$ rails generate model Puppy name:string dog_id:references 

,然後我這樣做:

class Owner < ActiveRecord::Base 
    has_many :dogs 
end 

class Dog < ActiveRecord::Base 
    belongs_to :owner 
    has_many :puppies 
end 

class Puppy < ActiveRecord::Base 
    belongs_to :dog 
end 

但是當我運行:

$ bundle exec rake db:migrate 

我得到這個錯誤:

== CreateOwners: migrating ================================================== 
-- create_table(:owners) 
    -> 0.0063s 
== CreateOwners: migrated (0.0064s) ========================================= 

== CreateDogs: migrating ============================================== 
-- create_table(:dogs) 
rake aborted! 
An error has occurred, this and all later migrations canceled: 

wrong number of arguments (1 for 0)/Users/7stud/rails_projects/test1/db/migrate/20141011043159_create_dogs.rb:4:in `block in change' 

...這裏是20141011043159_create_dogs.rb

class CreateDogs < ActiveRecord::Migration 
    def change 
    create_table :dogs do |t| 
     t.name :string 
     t.references :owner_id, index: true 

     t.timestamps 
    end 
    end 
end 

完整的錯誤消息:

~/rails_projects/test1$ rails generate model Owner name:string 
     invoke active_record 
     create db/migrate/20141011051648_create_owners.rb 
     create app/models/owner.rb 
     invoke test_unit 
     create  test/models/owner_test.rb 
     create  test/fixtures/owners.yml 

~/rails_projects/test1$ rails generate model Dog name:string owner:references 
     invoke active_record 
     create db/migrate/20141011051712_create_dogs.rb 
     create app/models/dog.rb 
     invoke test_unit 
     create  test/models/dog_test.rb 
     create  test/fixtures/dogs.yml 

~/rails_projects/test1$ rails generate model Puppy name:string dog:references 
     invoke active_record 
     create db/migrate/20141011051736_create_puppies.rb 
     create app/models/puppy.rb 
     invoke test_unit 
     create  test/models/puppy_test.rb 
     create  test/fixtures/puppies.yml 

然後我編輯的模型是這樣的:

class Owner < ActiveRecord::Base 
    has_many :dogs 
end 

class Dog < ActiveRecord::Base 
    belongs_to :owner 
    has_many :puppies 
end 

class Puppy < ActiveRecord::Base 
    belongs_to :dog 
end 


~/rails_projects/test1$ bundle exec rake db:migrate 
== CreateOwners: migrating =================================================== 
-- create_table(:owners) 
    -> 0.0063s 
== CreateOwners: migrated (0.0065s) ========================================== 

== CreateDogs: migrating ===================================================== 
-- create_table(:dogs) 
    -> 0.0017s 
== CreateDogs: migrated (0.0018s) ============================================ 

== CreatePuppies: migrating ================================================== 
-- create_table(:puppies) 
    -> 0.0017s 
== CreatePuppies: migrated (0.0019s) ========================================= 

Yeehaw!有效。

回答

0

您應該從聲明中刪除_id。 Rails會正確地生成它。 如果你想保持這種方式,將其聲明爲一個整數。

+0

我刪除了模型和遷移,重建的機型,比如'$軌命令生成模型狗的名字:字符串業主:references'和我得到確切同樣的錯誤。 – 7stud 2014-10-11 04:57:21

+0

在這裏工作就像一個魅力。試試anusha發佈的答案,這是您的移植和我的唯一區別。 – 2014-10-11 05:04:35

+0

我甚至試着改變模型的名字,認爲可能有些東西我沒有正確刪除,而且我得到了完全相同的錯誤。我正在放棄過夜。 – 7stud 2014-10-11 05:11:17

0

試試這個:

class CreateDogs < ActiveRecord::Migration 
    def change 
    create_table :dogs do |t| 
     t.string :name 
     t.integer :owner_id 

     t.timestamps 
    add_index :dogs, :owner_id 
    end 
    end 
end 
+0

該遷移產生完全相同的錯誤。第4行是't.string:name' – 7stud 2014-10-11 05:02:10

+0

@ 7stud發佈您的整個錯誤日誌 – anusha 2014-10-11 05:14:14

+0

我已經刪除了所有內容,並且當我試圖再次創建錯誤時,遷移工作。我發佈了我在帖子末尾所做的工作。我不知道這次爲什麼會這樣。我試着用幾個不同的模型名稱來做,每次我得到同樣的錯誤。每次我在再次嘗試之前刪除遷移和模型。我不知道上次有什麼不同。 – 7stud 2014-10-11 05:29:01