Rails 3 Модели, содержащие себя? - PullRequest
1 голос
/ 03 июня 2011

Я сейчас работаю над созданием объектной модели вложенного типа, и мне было любопытно, как бы я справился с этим с помощью Rails 3.

В основном у меня есть следующее:

  • Утверждение
  • Группа выражений
  • Выражение

Утверждение состоит из 1-N групп выражений.Группы Expression_Group состоят из 1-N выражений.Сложность для меня с ORM, и это то, что Expression_Groups также может состоять из других Expression_Groups.

Подумайте о SQL SELECT и скажите, что мы создаем предложение WHERE.1017 * Когда мы смотрим на что-то подобное, мы можем разбить его и сказать:

 Z = 4 - Expression
(Z = 4 OR S <> 2) - Expression Group
(Y > 2 OR (Z = 4 OR S <> 2)) - Expression Group CONTAINING Expression AND Expression_Group

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

Я знаю, как настроитьвсе отношения, КРОМЕ для Expression_Groups, содержащих Expression_Groups.

Есть идеи?

Ответы [ 2 ]

0 голосов
/ 03 июня 2011

Рассматривали ли вы has_and_belongs_to_many? http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html

0 голосов
/ 03 июня 2011

Если предположить потенциальную взаимосвязь один-ко-многим между ExpressionGroup объектами, может сработать такая ассоциация:

has_many :child_expression_groups,
         :class_name => "ExpressionGroup",
         :foreign_key => "parent_id",
         :dependent => :destroy

Обратите внимание, для этого потребуется новое поле - parent_idв вашей таблице expression_groups, которая может быть нулевой и содержит идентификатор родителя ExpressionGroup (если есть родитель).

Затем вы можете получить все верхний уровень группировок выражений путем извлечения только тех элементов в вашей системе, для которых parent_id установлено в nil (или определена область для этого в модели ExpressionGroup).

Если вам требуется более сложная обработка (например, созданиеэто много ко многим и т. д.), посмотрите на что-то вроде Ancestry .

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