Есть ли способ обеспечить одну ссылку на объект на запись в иерархии ActiveRecord? - PullRequest
2 голосов
/ 02 октября 2009

Когда я хватаю какую-то иерархическую структуру ActiveRecord, кажется, что база данных содержит довольно много обращений. Я улучшил это, используя опцию: include, чтобы выделить как можно большую часть структуры. Несмотря на это, кажется, что ActiveRecord не отображает взаимные стороны отношения (например, parent-child) с уникальными ссылками на запись. То есть мы получаем навигационную структуру ActiveRecord, но, насколько мне известно, она не гарантирует уникальную копию данной записи.

node = Node.find(1, :include => {:document => :node})
node.object_id #A
node.document.node.object_id #B although I expect/desire A

неизбежно в ActiveRecord? Перешли ли другие на альтернативные ORM из-за подобных недостатков? (Не поймите меня неправильно: ActiveRecord - отличный инструмент. Но все инструменты имеют свои сильные и слабые стороны.)

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

Ответы [ 4 ]

0 голосов
/ 13 августа 2013

Для тех, кто спотыкается через эти годы после того, как его спросили (как я!), Проверьте https://stackoverflow.com/a/4116397/1000655.

Предлагается использовать :inverse_of для настройки двунаправленных ассоциаций. Хотелось бы, чтобы в прошлом я не просматривал эту часть документации столько раз!

0 голосов
/ 04 октября 2009

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

Если бы вы могли предоставить немного больше информации о вашем случае использования, это могло бы помочь нам выяснить, есть ли другой способ решения вашей проблемы.

0 голосов
/ 21 мая 2010

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

Я посмотрел на DataMapper и вижу, что он специально решает эту проблему:

Одна строка в базе данных должен равняться одной ссылке на объект. Довольно простая идея. Довольно глубокий влияние. Если вы запустите следующий код в ActiveRecord вы увидите все ложные Результаты. Сделайте то же самое в DataMapper и это правда все время вниз ...

0 голосов
/ 03 октября 2009

Итак, если у вас есть узел, у него есть parent_id. Для всех узлов родитель не должен быть родителем любого другого узла. Другими словами, для всех узлов parent_id должен быть уникальным.

class Node
  has_one :child, :class_name => "Node", :foreign_key => :parent_id

  belongs_to :parent, :class_name => "Node"
  validates_uniqueness_of :parent_id
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...