Когда вы описываете теги, кажется, что они являются скорее аспектом, поэтому вы можете реализовать их как полиморфную ассоциацию. Но вы должны делать это много-много, так как теги могут многократно использоваться среди пользователей и тегируемых объектов. Давайте назовем модель объединения Tagging
, которая будет принадлежать пользователю, если вы хотите вспомнить, кто создал тегирование.
class Tag < ActiveRecord::Base
has_many :taggings, :dependent => :destroy
has_many :colors, :through => :taggings, :source => :taggable, :source_type => "Color"
has_many :favorites, :through => :taggings, :source => :taggable, :source_type => "Favorite"
end
class Tagging < ActiveRecord::Base
belongs_to :user
belongs_to :taggable, :polymorphic => true
belongs_to :tag
end
class Color < ActiveRecord::Base
belongs_to :user
has_many :taggings, :as => :taggable
has_many :tags, :through => :taggings
end
class Favorite < ActiveRecord::Base
belongs_to :user
has_many :taggings, :as => :taggable
has_many :tags, :through => :taggings
end
class User < ActiveRecord::Base
has_many :favorites
has_many :colors
has_many :taggings
has_many :tags, :through => :taggings
end
Что касается обновления Favorite, я согласен с вами: вы в основном будете работать в рамках пользователя (скорее всего, текущего пользователя).