2016-12-17 43 views
1

這裏是我的移民文件如何在Ruby on Rails中爲兩個模型使用一個外鍵?

class CreateTestRevisions < ActiveRecord::Migration 
    def change 
    create_table :test_revisions do |t| 
     t.integer :user_id 
     t.integer :test_id 
     t.integer :question_id 
     t.integer :test_type 
     t.timestamps null: false 
    end 
    end 
end 

我有兩個型號:OnlineTest & AllindiaTest

如何將t.integer :test_id與這兩個模型聯繫起來?

+0

你想要什麼樣的關聯?這裏的情況如何?在線測試和allindia測試之間的關係是什麼? –

回答

0

您可以使用foreign_key選項指定相同的密鑰兩種車型,如:

class TestRevision < ApplicationRecord 
    belongs_to :online_test, foreign_key: :test_id 
    belongs_to :allindia_test, foreign_key: :test_id 
end 

或者我認爲最好的方式是通過delegate對待這兩個對象爲一體:

delegate :allindia_test, to: :online_test 

這樣,您只需要有一個關聯:online_test,當您撥打電話allindia_test時,該電話將被委託給online_test

編輯:

好吧,如果你想有兩種不同的關係,你需要在這種情況下,兩個不同的ID:online_test_id & all_india_test_id

class TestRevision < ApplicationRecord 
    belongs_to :online_test 
    belongs_to :all_india_test 
end 
+0

當'OnlineTest'' id'爲1且'AllIndiaTest''''也爲1時會發生什麼?您如何識別差異? – Deep

+0

如果是這樣,那麼你需要在你的表中有兩個不同的id:'online_test_id'和'all_india_test_id'。請看我更新的答案。 –

+0

我不同他們t.integer:test_type,這意味着如果它是OnlinTest test_type是'1'或如果是所有印度測試測試類型是'2' –

1

您可以設置一個多態關聯是這樣的:

class OnlineTest < ActiveRecord::Base 
    has_many :test_revisions, as: :testable 
end 

class AllindiaTest < ActiveRecord::Base 
    has_many :test_revisions, as: :testable 
end 

class TestRevision < ActiveRecord::Base 
    belongs_to :testable, polymorphic: true 
end 

並確保您有test_revisions表中的兩列:

testable_id: integer 
testable_type: string 

testable_id將存儲OnlineTestAllindiaTest ID 。 testable_type將存儲OnlineTestAllindiaTest字符串。

所以,如果你有一個test_devision,您可以使用test_devision.testable獲得OnlineTestAllindiaTest,取決於testable_type

有關Polymorphich assocication的更多信息:

相關問題