1

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'

タグにタグを付ける方法についてのアイデアをいただければ幸いです。ありがとうございました。

4

0 に答える 0