Ассоциации Ruby on Rails для теории множеств (объединение, разность, пересечение и т. Д.) - PullRequest
1 голос
/ 06 апреля 2010

Я бы хотел ассоциацию has_many, которая работает следующим образом:

class Hood
  acts_as_tree
  has_many :houses, :union_with => :parent
end

class House
end

где любой Дом, связанный с Капюшоном 1, также будет возвращен в .houses субстанций Капюшона 1 вместе с отдельными ассоциациями субстанций.

Ассоциация должна работать только с точки зрения Капюшона.

Я написал макрос union_with_parent, который дал желаемый эффект, но много нежелательных побочных эффектов. Основная проблема заключалась в том, что has_many :dependent => :destroy привело к непредвиденным удалениям; удаление субтитра также вызвало удаление всех домов в родительском колпаке, поскольку я просто переопределил метод houses.

Схожая проблема с макросом разности множеств, за исключением того, что ни один из домов субстанции не был разрушен. (Подумайте об этом как о маске. Таким образом, в подсвободе будут все дома родительского колпака, за исключением тех, которые фактически перечислены в базе данных как принадлежащие субчастью. Опция :dependent => :destroy приводит к разрушению всех родительских домов, но ни один из тех, кто находится в подземелье, так как мы снова переопределили дома. Поведение, которое я хотел бы: уничтожается только содержимое маски.)

Я думал о написании макроса has_many_union, но похоже, что все ассоциации довольно сложны.

Я делаю это глупо? Есть ли более простой способ? Или я должен кардинально изменить дизайн? (Я бы действительно предпочел не переделывать дизайн, поскольку передача данных не идеальна.)

(Кстати, да, я знаю, что эта метафора отстой. Мой реальный дизайн не имеет смысла для большинства, поскольку это биоинформатика.)

Может быть, вы все знаете какой-нибудь лучший способ добиться желаемого эффекта?

1 Ответ

1 голос
/ 07 апреля 2010

Вы не хотите смешивать такие вещи, как :dependent => :destroy со сложными поисками. Вы можете сохранить свой код для .houses, но добавить простую ассоциацию has_many для обработки уничтожения:

has_many :exclusive_houses, :class_name => 'House', :dependent => 'destroy'

, а затем создайте .houses из .exclusive_houses и parent.houses или чего-либо еще. Это уничтожит только дома с идентификатором уничтоженного капюшона hood_id.

Кроме того, чтобы вы знали, ваш пример не имеет смысла в теории множеств. Элементы набора включены в его надмножество, а не в его подмножества. Если у вас действительно есть структура с вложенными множествами, для этого может быть лучше архитектура, чем у деревьев.

...