Sha256: e88340363c611e5ff14a62ce5f2cb40c4c830c8e1556747187852ec5bdc71bf6

Contents?: true

Size: 1.96 KB

Versions: 1

Compression:

Stored size: 1.96 KB

Contents

require 'ordered_tree/class_methods'
require 'ordered_tree/instance_methods'

module OrderedTree #:nodoc:
  # Configuration:
  #
  #   class Person < ActiveRecord::Base
  #     ordered_tree :foreign_key   => :parent_id,
  #                  :order         => :position
  #   end
  #
  #   class CreatePeople < ActiveRecord::Migration
  #     def self.up
  #       create_table :people do |t|
  #         t.column :parent_id ,:integer ,:null => false ,:default => 0
  #         t.column :position  ,:integer
  #       end
  #       add_index(:people, :parent_id)
  #     end
  #   end

  def ordered_tree(options = {})
    cattr_accessor :ordered_tree_config
    self.ordered_tree_config ||= {}
    self.ordered_tree_config[:foreign_key] ||= :parent_id
    self.ordered_tree_config[:order] ||= :position
    self.ordered_tree_config[:primary_key] ||= :id
    self.ordered_tree_config.update(options) if options.is_a?(Hash)

    belongs_to(
      :parent_node,
      lambda { |instance| where(instance.send(:scope_condition)) },
      :class_name  => self.name,
      :foreign_key => ordered_tree_config[:foreign_key],
      :primary_key => ordered_tree_config[:primary_key],
    )
    has_many(
      :child_nodes,
      lambda { |instance|
        where(instance.send(:scope_condition)).
          order(ordered_tree_config[:order])
      },
      :class_name  => self.name,
      :foreign_key => ordered_tree_config[:foreign_key],
      :primary_key => ordered_tree_config[:primary_key]
    )
    scope :roots, lambda { |*args|
      column = "#{self.table_name}.#{self.ordered_tree_config[:foreign_key].to_sym}"
      scope_condition = args[0]
      where(scope_condition).
        where("#{column} = 0 OR #{column} IS NULL").
        order(self.ordered_tree_config[:order])
    }

    include OrderedTree::ClassMethods
    include OrderedTree::InstanceMethods
  end #ordered_tree
end #module OrderedTree

ActiveRecord::Base.extend OrderedTree

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
ordered_tree-1.0.0 lib/ordered_tree.rb