6

내 스키마는 Tags으로 태그를 지정할 수있는 ArticlesJournals입니다. 이 경우 과 Tagging 조인 테이블의 다형성 관계가 필요합니다.두 개의 다형성을 가진 레일스 모델 has_many through : 객체 태깅을위한 연관

오케이, 간단하고 잘 문서화 된 부분입니다.

내 문제는 Articles이 기본 태그와 하위 태그를 모두 가질 수 있다는 것입니다. 기본 태그는 내가 가장 관심을 갖고있는 것이지만, 내 모델은이 하위 태그를 추적해야합니다. 하위 태그는 덜 중요한 중요도 인 Article을 설명하는 레이블이지만 동일한 글로벌 풀 Tags에서 오는 레이블입니다. (사실 Article의 기본 태그는 다른 하위 태그 일 수 있습니다). 이 달성

이 내가 유효한는 않지만, 이는 지금까지 무슨이다 Tagging 모델이 개 협회 및 Tagshas_many through: 협회 (즉 #tags & # 하위 태그)

을 위해 Article 모델이 필요 기본 태그와 하위 태그를 분리하지 마십시오.

class Article < ActiveRecord::Base 
    has_many :taggings, as: :taggable 
    has_many :tags, through: :taggings 

    has_many :sub_taggings, as: :taggable, class_name: 'Tagging', 
      source_type: 'article_sub' 
    has_many :sub_tags, through: :sub_taggings, class_name: 'Tag', source: :tag 
end 

class Tagging < ActiveRecord::Base 
    # id   :integer 
    # taggable_id :integer 
    # taggable_type :string(255) 
    # tag_id  :integer 
    belongs_to :tag 
    belongs_to :taggable, :polymorphic => true 
end 

class Tag < ActiveRecord::Base 
    has_many :taggings 
end 

나는 어딘가에서 내가 sourcesource_type의 오른쪽 조합을 찾아야하지만 난 그것을 밖으로 작동하지 않을 수 있다는 것을 알고.

완전성을 위해 여기에 ""이 테스트를 위해 사용하고 있습니다. 현재 "잘못된 태그"에 실패하고 있습니다.

describe "referencing tags" do 
    before do 
    @article.tags << Tag.find_or_create_by_name("test") 
    @article.tags << Tag.find_or_create_by_name("abd") 
    @article.sub_tags << Tag.find_or_create_by_name("test2") 
    @article.sub_tags << Tag.find_or_create_by_name("abd") 
    end 

    describe "the correct tags" do 
    its(:tags) { should include Tag.find_by_name("test") } 
    its(:tags) { should include Tag.find_by_name("abd") } 
    its(:sub_tags) { should include Tag.find_by_name("abd") } 
    its(:sub_tags) { should include Tag.find_by_name("test2") } 
    end 

    describe "the incorrect tags" do 
    its(:tags) { should_not include Tag.find_by_name("test2") } 
    its(:sub_tags) { should_not include Tag.find_by_name("test") } 
    end 
end 

이 문제를 해결하기위한 도움에 미리 감사드립니다. 가장 큰 문제는 Rails에 source_type을 사용하여 기사에서 sub_tags 연관을 사용하는 방법을 설명 할 수 없다는 것입니다.

답변

10

음 ... 다시 침묵 ...? 그래서 무엇을 제공합니까? 여보세요...? 뷰어? Single Table Inheritance에보고 한 후

(하지 대답하지만, 다른 약간 관련 문제에 대한 흥미로운 기술), I는 다중 참조에 관한 SO 질문을 우연히 발견 :

여기에 대답, 두려워하지 마십시오 동일한 모델에있는 다형성 연관으로

은 기본적으로 우리가 명시 적으로 sub_taggings 협회의 Taggings 테이블의 taggable_type 칼럼의 내용을 정의해야합니다. (당신이 당신의 detailed answer에 대한 +1을 hakunin 감사),하지만 대신 :conditionssource 또는 source_type와. 이제 아래 그림

Article 모델은 모든 테스트를 통과 :

class Article < ActiveRecord::Base 
    has_many :taggings, as: :taggable 
    has_many :tags, through: :taggings, uniq: true, dependent: :destroy 

    has_many :sub_taggings, as: :taggable, class_name: 'Tagging', 
      conditions: {taggable_type: 'article_sub_tag'}, 
      dependent: :destroy 
    has_many :sub_tags, through: :sub_taggings, class_name: 'Tag', 
      source: :tag, uniq: true 
end 

UPDATE :

이 태그에 기능 역 다형성 연관을 생산하는 올바른 Tag 모델입니다. 역방향 연관 (즉, Tag.articles 및 Tag.subTagged_articles)은 테스트를 통과시킵니다.

class Tag < ActiveRecord::Base 
    has_many :articles, through: :taggings, source: :taggable, 
      source_type: "Article" 
    has_many :sub_tagged_articles, through: :taggings, source: :taggable, 
      source_type: "Article_sub_tag", class_name: "Article" 
end 

는 또한 확장하고 성공적으로 동일한 태그 모델과 태그 테이블을 조인을 사용하여 다른 모델의 & sub_tagging 태그를 허용하도록 스키마를 테스트했습니다. 희망이 사람을 도움이됩니다.