2014-10-11 2 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

+0

Работал как очарование здесь. Попробуйте ответить, отправленный anusha, что является единственной разницей между вашей миграцией и моей. –

+0

Я даже пытался изменить имена моделей, думая, что может быть что-то, что я не удалял должным образом, и получаю точно такую ​​же ошибку. Я ухожу на ночь. – 7stud

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

+0

@ 7stud опубликовать весь журнал ошибок – anusha

+0

Я удалил все, и когда я попытался создать ошибку снова, миграция сработала. Я опубликовал то, что я сделал в конце своего сообщения. Я понятия не имею, почему это сработало на этот раз. Я попытался сделать это с несколькими разными именами моделей, и каждый раз я получал ту же ошибку. Каждый раз, когда я удалял миграцию и модели, прежде чем повторять попытку. Я не знаю, что было в последний раз. – 7stud

Смежные вопросы