4

Video、a、およびSonganにArticleは多くのがありTagsます。そして、それぞれTagが多くを持つことができますVideo, Songs or Articles。だから私は5つのモデルを持っています:Video, Song, Article, Tag and Taggings

これらのモデルは次のとおりです。

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_tohas_many?)?私の腸は私が何かを逃したと私に言います。私はたくさんの記事を見てきました、そして私はそれらにかなり混乱しています。

4

1 に答える 1

10

次の変更が必要です。

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

あなたのクラスTaggingsname 以外は問題ないようです。単数でなければなりませんTagging:

class Tagging < ActiveRecord::Base # no 's'!
  belongs_to :tag                           
  belong_to :taggable, :polymorphic => true 
end
于 2012-09-05T19:29:10.617 に答える