6

Benim şemam Tags ile etiketlenebilir Articles ve Journals vardır. Bu benim Tagging birleştirme tablosuna bir polimorfik ilişki ile bir has_many through: ilişki gerektirir.İki polimorfik has_many ile ray modeli: nesne etiketleme için ilişkilendirmeler

Tamam, bu kolay ve iyi belgelenmiş bir bölümdür.

Sorunum, Articles'un hem birincil etiketlere hem de alt etiketlere sahip olabileceğidir. Birincil etiketler en çok ilgilendiğim şeydir, ancak modelimin de bu alt etiketleri takip etmesi gerekir. Alt etiketler, daha az önem taşıyan Article'u tanımlayan etiketlerdir, ancak aynı global Tags havuzundan gelir. (aslında, bir Article'un birincil etiketi başka bir alt etiketi olabilir). Bu ulaşılması

Bu benim geçerli yapar iken, hangi bugüne kadar ne var Tagging modeline iki dernek ve Tags iki has_many through: dernek (yani #tags & # alt etiketleri)

olması Article modeli gerektirir birincil etiketleri ve alt etiketleri ayrı tutmayın.

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 

Oralardan I source ve source_type doğru kombinasyonunu bulmak gerekir ama bunu dışarı çalışamaz biliyoruz.

Tam olarak burada test etmek için kullanıyorum article_spec.rb benim "yanlış etiketler" üzerinde başarısız oluyor.

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 

Bunu gerçekleştirme konusunda herhangi bir yardım için şimdiden teşekkür ederiz. Ana sorun, Source_type makalelerinde Sub_tags ilişkilendirmesi için kullanılacak Rails'e nasıl söyleneceğimi anlayamıyorum.

cevap

10

Hmmm ... Sessizlik tekrar ...? SO ne verir? Merhaba...? Bueller? Single Table Inheritance içine baktıktan sonra

(değil cevap, ancak diğer hafifçe ile ilgili sorunlar için ilginç bir tekniği), ben çoktan referanslar konusunda SO soru rastladım:

burada bir cevap, Hiç korkma Aynı model üzerinde bir polimorfik ilişki için.

Temelde biz açıkça sub_taggings ilişki için Taggings tabloda taggable_type sütunun içeriğini tanımlamak gerekir (. Eğer senin detailed answer için +1 hakunin ederiz), ancak bunun yerine :conditions ile source veya source_type ile. Şimdi, aşağıda gösterildiği

Article modeli, tüm testler geçirir:

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:

Bu Etiketler fonksiyonel bir ters polimorfik ilişkileri üreten doğru Tag modelidir. Ters ilişki (yani Tag.articles ve Tag.sub_tagged_articles) testleri geçer.

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 

Ben de genişletilmiş ve başarıyla aynı Etiket modeli ve Etiketleme birleşim tablosu kullanan diğer modellerin & sub_tagging etiketleme izin şema test ettik. Umarım bu birisine yardım eder.