Ассоциация «многие ко многим» к одной модели с ActiveRecord? - PullRequest
2 голосов
/ 19 июня 2009

Я следую этому учебнику , который прекрасно работает для has_many: через отношения. У меня есть нормальные вещи, например, работает category_product.

Однако я не могу осмыслить эту ситуацию (и заставить ее работать): у меня есть категория, которая имеет связанные категории. Поскольку каждая категория может иметь N категорий ... во-первых, действительно ли это ситуация "многие ко многим" (я вполне уверен, что это так)? Во-вторых, как это будет выглядеть? Моя миграция выглядит так:

create_table :categories do |t|
  t.string :name
  t.timestamps
end

create_table :related_categories, :id => false do |t|
  t.integer :category_a_id
  t.integer :category_b_id
end

а у моей модели мужество

has_many :related_categories, :foreign_key=>"category_a_id"
has_many :categories, :through => :related_categories, :source=>:category_a

Это, очевидно, не правильно, хотя оно и есть (то есть, оно сломано на 100%). Как я могу это сделать?

Редактировать: Я забыл это, но только здесь, на SO (имеется в виду, что это не ответ):

class RelatedCategory < ActiveRecord::Base
  belongs_to :category_a, :class_name=>"Category"
  belongs_to :category_b, :class_name=>"Category"
end

Ответы [ 2 ]

2 голосов
/ 19 июня 2009

Вы должны попробовать :source => :category_b в объявлении has_many.

Вы уже использовали category_a_id в качестве внешнего ключа для таблицы связанных категорий. По сути, это говорит ActiveRecord о соответствии поля category_a_id в таблице related_categories текущему идентификатору объекта Category при извлечении всех связанных с ним записей related_categories. Исходный параметр в этом объявлении has_many :through указывает, какое поле следует учитывать для поиска (или записи, в этом отношении) связанных объектов при заполнении коллекции категорий.

0 голосов
/ 19 июня 2009

Вот ответ, но это не красиво.

  has_many :related_categories, :foreign_key=>"category_a_id"
  has_many :related_categories2, :class_name=>"RelatedCategory", :foreign_key=>"category_b_id"
  has_many :categories, :through => :related_categories, :source=>:category_b
  has_many :categories_backwards, :through => :related_categories2, :source=>:category_a
  has_many :category_products

тогда вам придется сделать какой-нибудь тупой метод получения, который объединяет категории + category_backwards, или что-то в этом роде.

Редактировать [2 минуты спустя]: Ух ты, с геттером это кажется почти идеальным! Конечно, проблема в том, что вам нужно переходить к категориям, а не к тому, что вы получаете от получателя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...