4

A VideoSongArticle可以有许多Tags。而且每个Tag也可以有很多Video, Songs or Articles。所以我有5个型号:Video, Song, Article, Tag and TaggingsRuby on Rails中的多对多关联

下面是这些模型:

class Video < ActiveRecord::Base 
    has_many :tags, :through => :taggings 
end 

class Song < ActiveRecord::Base 
    has_many :tags, :through => :taggings 
end 

class Article < ActiveRecord::Base 
    has_many :tags, :through => :taggings 
end 

class Tag < ActiveRecord::Base 
    has_many :articles 
    has_many :videos 
    has_many :songs 
    belong_to :taggings, :polymorphic => true #is this correct? 
end 

的数据库定义Taggings

create_table "taggings", :force => true do |t| 
    t.integer "tag_id" 
    t.string "taggable_type" 
    t.integer "taggable_id" 
    t.datetime "created_at", :null => false 
    t.datetime "updated_at", :null => false 
end 

Taggings型号:

class Taggings < ActiveRecord::Base 
    belongs_to :tag       #is this correct? 
    belong_to :taggable, :polymorphic => true #is this correct? 
end 

我担心的是这个问题,我有模型的正确定义(belongs_to,has_many?)?我的直觉告诉我,我错过了一些东西。我看过很多文章,我很困惑。

回答

11

您需要这些变化:

class Video < ActiveRecord::Base # or Song, or Article 
    has_many :taggings, :as => :taggable # add this  
    has_many :tags, :through => :taggings # ok 


class Tag < ActiveRecord::Base 
    # WRONG! Tag has no tagging_id 
    # belong_to :taggings, :polymorphic => true 

    has_many :taggings # make it this way 

    # WRONG! Articles are available through taggings 
    # has_many :articles 

    # make it this way 
    with_options :through => :taggings, :source => :taggable do |tag| 
    tag.has_many :articles, :source_type => 'Article' 
    # same for videos 
    # and for songs 
    end 

关于with_options

您的类Taggings好像除了它的名字。它必须是单数,Tagging

class Tagging < ActiveRecord::Base # no 's'! 
    belongs_to :tag       
    belong_to :taggable, :polymorphic => true 
end 
+0

谢谢jdoe。对于塔金斯来说,这应该是单一的。你可以不用'with_options'告诉我怎么做?我知道,这可能会更复杂,但对我来说没关系。我只想弄清楚我错过了什么。 –

+0

@Grienders'has_many:articles,:through =>:taggings,:source =>:taggable,:source_type =>'Article'' – jdoe

+0

为什么你说'has_many:articles,:through =>:taggings,:source = >:taggable,:source_type =>“Article”'但'has_many:articles,:through =>:taggings,:source =>:taggable(_type或_id?),:source_type =>“Article”'什么是'在'has_many:taggings,:as =>:taggable.'中表示的意思,顺便说一句,我是关于多态屁股的。 –