Поиск узла без дочерних элементов в древовидной структуре с помощью Rails - PullRequest
1 голос
/ 22 октября 2010

У меня есть древовидная структура, примерно такая:

class Node < ActiveRecord::Base
   belongs_to :parent,   :class_name => self.to_s, :foreign_key => 'parent_id'
   has_many   :children, :class_name => self.to_s, :foreign_key => 'parent_id', :dependent => :destroy
   ...
end

Я могу загрузить все узлы, у которых нет родителя, с такой областью:

named_scope :not_child, :conditions => 'parent_id IS NULL'

Но мне также нужно найти узлы, которые не имеют дочерних элементов, но могут иметь родителя, и мне трудно с этим. Я думаю, что я должен включить children_events, но тогда я потерялся, я не могу использовать:

named_scope, :faulty_not_parent, :include => :children, :conditions => "node.parent_id IS NULL"

Ответы [ 3 ]

3 голосов
/ 22 октября 2010

Понял:

named_scope :not_parent, :conditions => "id NOT IN (SELECT DISTINCT parent_id FROM nodes WHERE parent_id IS NOT NULL)"
1 голос
/ 22 октября 2010

Я настоятельно рекомендую вам использовать плагин для этого. Есть несколько acts_as_tree , awesome_nested_set и моя личная рекомендация ancestry , в которой для сопоставления структуры используется только один столбец, а не три, как во вложенных структурах множеств.

0 голосов
/ 23 октября 2010

Я не гуру SQL, поэтому я не смог найти хороший способ сделать это на чистом SQL.Конечно, это означает, что я также не смог найти способ сделать это с named_scopes.Но вы можете найти родителей и вычесть их из всех узлов, например, так:

def childless
 @childless ||= self.all - self.all(:joins => :children)
end

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

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