0

Sagen wir, ich habe ein Modell Hunde und jeder Hund hat genau 2 Cat „Feinde“, enemy1 und enemy2, wie kann ich die Migrationsdatei schreiben, so dass ich dog.enemy1 nennen kann die erste abrufen Feind und dog.enemy2 den zweiten Feind abzurufen? Ich versuchte dies:Mehrere Verbände auf das gleiche Modell in Rails

create_table :dog do |t| 
    t.string :name 
    t.timestamps null: false 
    end 
    add_index :dog, :name 

    add_foreign_key :dogs, :cats, column: :enemy1_id 
    add_foreign_key :dogs, :cats, column: :enemy2_id 
end 

Ich versuchte es auch mit der t.references Methode konnte aber nicht an der Arbeit. Ich habe stundenlang an diesem Problem gearbeitet. und es funktioniert gut in der Entwicklung, aber nicht auf Heroku Postgres. Der Fehler, den ich bekommen ist

ActiveRecord::StatementInvalid: PG::UndefinedColumn: ERROR:column  "enemy1_id" referenced in foreign key constraint does not exist. 

Irgendwelche Ideen?

Antwort

1

Migration:

create_table :dog do |t| 
    t.string :name 
    t.integer :enemy1_id 
    t.integer :enemy2_id 
    t.timestamps null: false 
end 

Dog Modell:

class Dog < ActiveRecord::Base 
    has_one :enemy1, class: 'Cat', foreign_key: :enemy1_id 
    has_one :enemy2, class: 'Cat', foreign_key: :enemy2_id 
end 
0

ich es einfach gelöst, unabhängig von 2 Sekunden nach der ersten Antwort kam .. schließlich.

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

     t.timestamps null: false 
    end 
    add_index :dogs, :name 

    add_foreign_key :dogs, :cats, column: :enemy1_id 
    add_foreign_key :dogs, :cats, column: :enemy2_id 
end 
0

Es gibt keine 'has_two' Assoziation in Schienen. Sie sollten sich also mit has_many association absprechen.

class Dog < ActiveRecord::Base 
    has_many :cats, limit: 2 

    scope :enemy1, Proc.new { |object| object.cats.first } 
    scope :enemy2, Proc.new { |object| object.cats.last } 
end 

in der Klasse Katze

class Cat < ActiveRecord::Base 
    belongs_to :dog 
end 

Nun ist die Migration für Katzen sollten

t.references :dog 

Sie haben brauchen keine ausländischen Felder in Ihrem Hund Modell erstellen. Dies sollte Ihre Probleme lösen.