2013-12-23 2 views
1

Employee, Manager, Subordinate 예제로이 작업을 수행하는 방법에 대한 정보가 상당히 많이 있지만, 그렇지 않은 경우 온라인에서 다른 것을 찾을 수 없습니다.여러 개의 자체 조인 관계는 어떻게 만듭니 까?

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. 

내 모델 : 당신은 AntonymSynonym 클래스를 정의 할 필요가 없습니다

# 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

합니다. 당신이 관계 antonymssynonymsWord 유형이 있음을 암시하는 당신의 has_many 정의에 class_name 옵션을 지정하여

.

그래서 모두 AntonymSynonym 클래스를 제거하고 바로 Word 유지 :

나는 관계가 word has_many antonymsword has_many synonyms 대신 has_many...:through 될 수 있다고 생각 :

# 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 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

을 넣을 수 있지만 나를 포기 'unknown attribute : antonym_id' 오류. 모델에 antonym_id를 명시 적으로 추가해야합니까? – perseverance

+0

@perseverance, 네가 필요합니다 ('synonym_id'와'antonym_id'). 그들은'words' 테이블의 컬럼이어야합니다 당신이 이미 기둥을 가지고 있었다는 인상 아래에 있었어. – vee

+0

Currentl y 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...)

관련 문제