0

假設我有一個模型狗和每隻狗都有2個Cat「敵人」,enemy1enemy2,我如何編寫遷移文件以便我可以撥打dog.enemy1來檢索第一個敵人和dog.enemy2找回第二個敵人? 我嘗試這樣做: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 

我還與t.references方法嘗試過,但無法得到它的工作。幾個小時一直在處理這個問題。並且它在開發中工作正常,但在Heroku Postgres上沒有問題。 我得到的錯誤是

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

任何想法?

回答

1

遷移:

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

狗型號:

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

我只是解決了它獨立,第一個答案2秒後來由。 最後。

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

在rails中沒有'has_two'關聯。所以你應該與has_many協會解決。

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 
類貓

class Cat < ActiveRecord::Base 
    belongs_to :dog 
end 

現在對於創建貓遷移應該有

t.references :dog 

你不必在你的狗模型洋田。這應該可以解決你的問題。