2013-12-23 14 views
1

有關如何與員工,經理,下屬示例一起完成此操作的相關信息很多,但除此之外我無法在網上找到其他任何信息。你如何創建多個自連接關係?

我只是試圖創建一個模型模式,其中的Word對象可以有許多反義詞或許多同義詞。這些反義詞和同義詞基本上是單詞對象。

我希望能夠運行以下命令:

word = Word.create(name:'good') 
antonym = Word.create(name:'bad') 
word.antonyms << antonym 
synonym = Word.create(name:'right') 
word.synonyms << synonym 

word.antonyms # This gives you a resultset of all of the antonyms related to that word. 

我的模型:

# The following doesn't work right now 
class Word < ActiveRecord::Base 
    has_many :antonyms, :foreign_key => 'antonym_id', :class_name => 'Word' 
    has_many :synonyms, :foreign_key => 'synonym_id', :class_name => 'Word' 
end 

class Antonym < ActiveRecord::Base 
    belongs_to :word, :foreign_key => "word_id", :class_name => "Word" 
end 

class Synonym < ActiveRecord::Base 
    belongs_to :word, :foreign_key => "word_id", :class_name => "Word" 
end 

回答

0

你並不需要定義AntonymSynonym類。

通過在您has_many定義指定class_name選項可暗示的關係antonymssynonymsWord類型。

所以完全刪除AntonymSynonym類和只保留Word

# The following doesn't work right now 
class Word < ActiveRecord::Base 
    has_many :antonyms, :foreign_key => 'antonym_id', :class_name => 'Word' 
    has_many :synonyms, :foreign_key => 'synonym_id', :class_name => 'Word' 
end 

更新:

我覺得關係可以是word has_many antonymsword has_many synonyms而不是has_many...:through

class Word < ActiveRecord::Base 
    has_many :antonyms 
    has_many :synonyms 
end 

class Antonym < ActiveRecord::Base 
    belongs_to :word 
end 

class Synonym < ActiveRecord::Base 
    belongs_to :word 
end 

然後遷移(只顯示其中外鍵進入):

class CreateWords < ActiveRecord::Migration 
    def self.change 
    create_table :words do |t| 
     ... 
    end 
    end 
end 

class CreateAntonyms < ActiveRecord::Migration 
    def self.change 
    create_table :antonyms do |t| 
     t.references :word 
     ... 
    end 
    end 
end 

class CreateSynonyms < ActiveRecord::Migration 
    def self.change 
    create_table :synonyms do |t| 
     t.references :word 
     ... 
    end 
    end 
end 

你能想象這三個車型has_many...:through關係,即word has_many :synonyms through: :meanings和類似word has_many :antonyms through: :meanings。但是,然後連接表meanings將需要全部三個word,antonymsynonym用於每個記錄,這可能並不總是理想的,因爲添加單詞不應該需要至少一個反義詞和一個同義詞。

+0

我試着刪除其他文件,但它給我一個'未知屬性:antonym_id'錯誤。我需要明確地將antonym_id添加到模型嗎? – perseverance

+0

@perseverance,是的,你需要它們('synonym_id'和'antonym_id')。它們必須是你的'words'表中的列。我的印象是你已經有了列。 – vee

+0

Currentl在Word模型中有以下幾列:詞,定義。現在我要添加antonym_id和synonym_id。我是否需要添加其他列? – perseverance

0

我想你可以簡單地讓Word模型保持原樣,name列指定Word的類型。然後檢索antonymsynonym時,你可以簡單地範圍之

scope :antonym, where(name: 'bad') 
scope :synonym, where(name: 'right') 

...

(當然你也可以把它這樣scope :type, ->(type) { where(name: type)} # Word.type('bad') will outputs all the antonyms...)