Person (People)
、Tag
、およびの 3 つのモデルのタグ付けシステムがありTagging
ます。
Person と Tags の両方にタグ付けできるようにしたい (タグにタグを付ける)
Person
とのモデルはTagging
正しいようです。
class Person < ActiveRecord::Base
#associations
has_many :taggings, as: :taggable
has_many :tags, through: :taggings
end
class Tagging < ActiveRecord::Base
attr_accessible :taggable_id, :taggable_type
#associations
belongs_to :tag
belongs_to :taggable, polymorphic: true
end
<Person_instance>.tags
そのため、正しいタグを取得して取得できます。
問題はタグにあります。私は次のことを試しました:
class Tag < ActiveRecord::Base
attr_accessible :name
has_many :taggings
has_many :tags, through: :taggings, source: :taggable, source_type: :'Tag'
has_many :people, through: :taggings, source: :taggable, source_type: :'Person'
end
この設定では、タグは引き続き他のタグにタグを付けることができますが、モデルはタグ付けされるタグを反転させます。たとえば、Tag.id == 10 のタグを検索している場合、SQL は以下のように tag_id ではなく、taggable_id = 10 を検索する必要があります。
Tag.find(10).tags
Tag Load (0.4ms) SELECT `tags`.* FROM `tags` WHERE `tags`.`id` = 10 LIMIT 1
Tag Load (0.4ms) SELECT `tags`.* FROM `tags` INNER JOIN
`taggings` ON `tags`.`id` = `taggings`.`taggable_id`
WHERE `taggings`.`tag_id` = 10 AND `taggings`.`taggable_type` = 'Tag'
これは、SQL が以下を検索する Person に対して正しく機能しますtaggable_id
。
Person.find(:last).tags
Person Load (0.4ms) SELECT `people`.* FROM `people` ORDER BY `people`.`id` DESC LIMIT 1
Tag Load (0.4ms) SELECT `tags`.* FROM `tags` INNER JOIN `taggings` ON
`tags`.`id` = `taggings`.`tag_id` WHERE `taggings`.`taggable_id` = 3
AND `taggings`.`taggable_type` = 'Person'
タグにタグを付ける方法についてのアイデアをいただければ幸いです。ありがとうございました。