Как управлять таблицей без идентификатора в Rails? - PullRequest
3 голосов
/ 07 февраля 2009

У меня есть две модели: личность и отношение. Второй хранит информацию об отношениях между двумя людьми. Он имеет поля parent_id и child_id и не имеет поля id. Я связал его с has_many: через, и он работает.

Но:

  1. Relation.find (: all) возвращает пустой массив, даже если в таблице есть некоторые отношения (так как поле id отсутствует).
  2. Я не знаю, как удалить связь.

Мои модели выглядят так:

class Person < ActiveRecord::Base
  has_many :child_relations, 
           :class_name => "Relation", 
           :foreign_key => "parent_id"
  has_many :parent_relations, 
           :class_name => "Relation", 
           :foreign_key => "child_id"

  has_many :children, :through => :child_relations
  has_many :parents, :through => :parent_relations
end

class Relation < ActiveRecord::Base
  belongs_to :parent, :class_name => "Person"
  belongs_to :child, :class_name => "Person"
end

Есть предложения?

ОБНОВЛЕНИЕ: я использовал has_many: через , потому что я также храню информацию о типе отношения в таблице. В настоящее время я сдался и добавил поле id в свою таблицу (соглашение Rails ...). Но мой вопрос остается открытым.

Ответы [ 3 ]

7 голосов
/ 07 февраля 2009

has_many: сквозной зависит от идентификатора в таблице соединений. Это делает таблицу соединений целой моделью. Поскольку каждая операция с записями происходит с идентификатором, вы не сможете напрямую взаимодействовать с таблицей без нее. При удалении записи rails генерирует sql для удаления записи по ее идентификатору. Если у вас есть таблица соединений, которая действует как полная модель, она должна иметь идентификатор

Или вы можете использовать has_and_belongs_to_many, который работает больше, чем вы ожидаете. Удаление отношения Вы удаляете объект через его связи, а не напрямую с моделью отношений.

Лучше всего добавить идентификатор в таблицу соединений. Таким образом, в будущем, если модель отношений станет более сложной, вы можете отслеживать ее как собственную сущность.

0 голосов
/ 07 февраля 2009

Я успешно использовал has_and_belongs_to_many в этой ситуации. Таблица соединения имеет только внешние ключи, но не идентификатор ключа. Важно отметить, что у вас нет модели для таблицы отношений, только две ссылки has_and_belongs_to_many в классе Person

Вот хорошая тщательная обработка по Has и принадлежит многим

0 голосов
/ 07 февраля 2009

Это должно дать вам шаг в правильном направлении. Я не на рельсах, чтобы проверить это, но должно быть довольно быстро настроить модель и попробовать это. Надеюсь, это поможет!

class Relation < ActiveRecord::Base
  belongs_to :parent, :class_name => "Person", :foreign_key => :parent_id
  belongs_to :child, :class_name => "Person", :foreign_key => :child_id
end

class Person < ActiveRecord::Base
  has_many :relations
  has_many :children, :through => :relations
  has_many :parents, :through => :relations
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...