Sha256: c11d83e54a50b7290259cdfdb8c6db969ede8d9fec60dbbe3290a2a2d47717d0

Contents?: true

Size: 1.95 KB

Versions: 19

Compression:

Stored size: 1.95 KB

Contents

module CollectiveIdea #:nodoc:
  module Acts #:nodoc:
    module NestedSet #:nodoc:
      class SetValidator

        def initialize(model)
          @model = model
          @scope = model.all
          @parent = arel_table.alias('parent')
        end

        def valid?
          query.count == 0
        end

        private

        attr_reader :model, :parent
        attr_accessor :scope

        delegate :parent_column_name, :primary_column_name, :primary_key, :left_column_name, :right_column_name, :arel_table,
          :quoted_table_name, :quoted_parent_column_full_name, :quoted_left_column_full_name, :quoted_right_column_full_name, :quoted_left_column_name, :quoted_right_column_name, :quoted_primary_column_name,
        :to => :model

        def query
          join_scope
          filter_scope
        end

        def join_scope
          join_arel = arel_table.join(parent, Arel::Nodes::OuterJoin).on(parent[primary_column_name].eq(arel_table[parent_column_name]))
          self.scope = scope.joins(join_arel.join_sources)
        end

        def filter_scope
          self.scope = scope.where(
                                   bound_is_null(left_column_name).
                                   or(bound_is_null(right_column_name)).
                                   or(left_bound_greater_than_right).
                                   or(parent_not_null.and(bounds_outside_parent))
                                   )
        end

        def bound_is_null(column_name)
          arel_table[column_name].eq(nil)
        end

        def left_bound_greater_than_right
          arel_table[left_column_name].gteq(arel_table[right_column_name])
        end

        def parent_not_null
          arel_table[parent_column_name].not_eq(nil)
        end

        def bounds_outside_parent
          arel_table[left_column_name].lteq(parent[left_column_name]).or(arel_table[right_column_name].gteq(parent[right_column_name]))
        end

      end
    end
  end
end

Version data entries

19 entries across 19 versions & 2 rubygems

Version Path
awesome_nested_set-3.8.0 lib/awesome_nested_set/set_validator.rb
awesome_nested_set-3.7.0 lib/awesome_nested_set/set_validator.rb
awesome_nested_set-3.6.0 lib/awesome_nested_set/set_validator.rb
awesome_nested_set-3.5.0 lib/awesome_nested_set/set_validator.rb
awesome_nested_set-3.4.0 lib/awesome_nested_set/set_validator.rb
awesome_nested_set-3.3.1 lib/awesome_nested_set/set_validator.rb
awesome_nested_set-3.3.0 lib/awesome_nested_set/set_validator.rb
awesome_nested_set-3.2.1 lib/awesome_nested_set/set_validator.rb
awesome_nested_set-3.2.0 lib/awesome_nested_set/set_validator.rb
awesome_nested_set-3.1.4 lib/awesome_nested_set/set_validator.rb
awesome_nested_set-3.1.3 lib/awesome_nested_set/set_validator.rb
awesome_nested_set-3.1.2 lib/awesome_nested_set/set_validator.rb
awesome_nested_set-3.1.1 lib/awesome_nested_set/set_validator.rb
awesome_nested_set-3.1.0 lib/awesome_nested_set/set_validator.rb
awesome_nested_set-3.0.3 lib/awesome_nested_set/set_validator.rb
solidus_backend-1.0.0.pre3 vendor/bundle/gems/awesome_nested_set-3.0.2/lib/awesome_nested_set/set_validator.rb
solidus_backend-1.0.0.pre2 vendor/bundle/gems/awesome_nested_set-3.0.2/lib/awesome_nested_set/set_validator.rb
solidus_backend-1.0.0.pre vendor/bundle/gems/awesome_nested_set-3.0.2/lib/awesome_nested_set/set_validator.rb
awesome_nested_set-3.0.2 lib/awesome_nested_set/set_validator.rb