module CollectiveIdea::Acts::NestedSet::Model::Validatable
def all_roots_valid?
def all_roots_valid? if acts_as_nested_set_options[:scope] all_roots_valid_by_scope?(roots) else each_root_valid?(roots) end end
def all_roots_valid_by_scope?(roots_to_validate)
def all_roots_valid_by_scope?(roots_to_validate) roots_grouped_by_scope(roots_to_validate).all? do |scope, grouped_roots| each_root_valid?(grouped_roots) end end
def each_root_valid?(roots_to_validate)
def each_root_valid?(roots_to_validate) left_column = acts_as_nested_set_options[:left_column] reordered_roots = roots_reordered_by_column(roots_to_validate, left_column) left = right = 0 reordered_roots.all? do |root| (root.left > left && root.right > right).tap do left = root.left right = root.right end end end
def left_and_rights_valid?
def left_and_rights_valid? SetValidator.new(self).valid? end
def no_duplicates_for_columns?
def no_duplicates_for_columns? [quoted_left_column_full_name, quoted_right_column_full_name].all? do |column| # No duplicates select("#{scope_string}#{column}, COUNT(#{column}) as _count"). group("#{scope_string}#{column}", quoted_primary_key_column_full_name). having("COUNT(#{column}) > 1"). order(primary_column_name => :asc). first.nil? end end
def roots_grouped_by_scope(roots_to_group)
def roots_grouped_by_scope(roots_to_group) roots_to_group.group_by {|record| scope_column_names.collect {|col| record.send(col) } } end
def roots_reordered_by_column(roots_to_reorder, column)
def roots_reordered_by_column(roots_to_reorder, column) if roots_to_reorder.respond_to?(:reorder) # ActiveRecord's relation roots_to_reorder.reorder(column) elsif roots_to_reorder.respond_to?(:sort) # Array roots_to_reorder.sort { |a, b| a.send(column) <=> b.send(column) } else roots_to_reorder end end
def scope_string
def scope_string Array(acts_as_nested_set_options[:scope]).map do |c| connection.quote_column_name(c) end.push(nil).join(", ") end
def valid?
def valid? left_and_rights_valid? && no_duplicates_for_columns? && all_roots_valid? end