Отдельная таблица Полиморфных Ассоциаций - PullRequest
3 голосов
/ 08 декабря 2011

После прочтения руководств по Ruby on Rails и нескольких ответов на вопросы stackoverflow на вопросы о полиморфной ассоциации я понимаю его использование и реализацию, но у меня есть вопрос о конкретном сценарии использования. У меня есть tags, который может быть связан с несколькими topics, categories, images и другими различными моделями (которые также имеют различные значения tags), но вместо размещения опорных полей (foreign_id, foreign_type ) в таблице tags я бы предпочел создать отдельную таблицу связей. Это все еще возможно, используя :polymorphic => true?

Примерно так:

create_table :tags do |t|
  t.string :name
  t.remove_timestamps
end

create_table :object_tags, :id => false do |t|
  t.integer :tag_id
  t.references :tagable, :polymorphic => true
  t.remove_timestamps
end

Если это невозможно, я планировал создать ту же таблицу :object_tags и использовать :conditions в модели Tag и других моделях для навязывания ассоциаций. Есть ли способ рельсов сделать это? Спасибо! (работа с rails 3.0.9 и ruby ​​1.8.7 <- потому что сервер развертывания все еще использует 1.8.7) </p>

UPDATE: Спасибо Дельба! Ответ - рабочее решение для полиморфизма HABTM.

class Tag < ActiveRecord::Base
  has_many :labels
end

class Label < ActiveRecord::Base
  belongs_to :taggable, :polymorphic => true
  belongs_to :tag
end

class Topic < ActiveRecord::Base
  has_many :labels, :as => :taggable
  has_many :tags, :through => :labels
end

create_table :tags, :timestamps => false do |t|
  t.string :name
end

create_table :labels, :timestamps => false, :id => false do |t|
  t.integer :tag_id
  t.references :taggable, :polymorphic => true
end

ОБНОВЛЕНИЕ: Поскольку мне нужен двунаправленный HABTM, я вернулся к созданию отдельных таблиц.

1 Ответ

1 голос
/ 09 декабря 2011

Да, и из вашего описания вы не можете иметь тегируемые столбцы в вашем теге, так как они могут иметь несколько тегируемых вещей и наоборот. Вы упомянули HABT, но вы не можете сделать что-либо вроде has_and_belongs_to,: polymorphic => true, насколько я знаю.

create_table :object_tags, :id => false do |t|
  t.integer :tag_id
  t.integer :tagable_id
  t.string  :tagable_type
end

Вашим другим таблицам не нужны никакие столбцы для тегов объекта, тегов или тегов.

class Tag < ActiveRecord::Base
  has_many :object_tags
end

class ObjectTag < ActiveRecord::Base
  belongs_to :tagable, :polymorphic => true
  belongs_to :tag
end

class Topic < ActiveRecord::Base
  has_many :object_tags, :as => :tagable
  has_many :tags, :through => :object_tags
end
...