Module | DataMapper::Is::Tree::ClassMethods |
In: |
lib/data_mapper/is/tree.rb
lib/data_mapper/is/tree.rb |
An extension to DataMapper to easily allow the creation of tree structures from your DataMapper Models. This requires a foreign key property for your model, which by default would be called :parent_id.
Example: class Category < DataMapper::Base property :parent_id, :integer property :name, :string is_a_tree :order => "name" end root +- child +- grandchild1 +- grandchild2 root = Category.create("name" => "root") child = root.children.create("name" => "child") grandchild1 = child1.children.create("name" => "grandchild1") grandchild2 = child2.children.create("name" => "grandchild2") root.parent # => nil child.parent # => root root.children # => [child] root.children.first.children.first # => grandchild1 Category.first_root # => root Category.roots # => [root]
The following instance methods are added:
Author: | Timothy Bennett (lanaer.com) |
first_root | -> | root |
first_root | -> | root |
Configuration options are:
# File lib/data_mapper/is/tree.rb, line 57 57: def is_a_tree(options = {}) 58: configuration = { :foreign_key => "parent_id" } 59: configuration.update(options) if options.is_a?(Hash) 60: 61: belongs_to :parent, :class_name => name, :foreign_key => configuration[:foreign_key], :counter_cache => configuration[:counter_cache] 62: has_many :children, :class_name => name, :foreign_key => configuration[:foreign_key], :order => configuration[:order] 63: 64: include DataMapper::Is::Tree::InstanceMethods 65: 66: class_eval "def self.roots\nself.all :\#{configuration[:foreign_key]} => nil, :order => \#{configuration[:order].inspect}\nend\n\ndef self.first_root\nself.first :\#{configuration[:foreign_key]} => nil, :order => \#{configuration[:order].inspect}\nend\n" 67: 68: class << self 69: alias_method :root, :first_root # for people used to the ActiveRecord acts_as_tree 70: end 71: end
Configuration options are:
# File lib/data_mapper/is/tree.rb, line 57 57: def is_a_tree(options = {}) 58: configuration = { :foreign_key => "parent_id" } 59: configuration.update(options) if options.is_a?(Hash) 60: 61: belongs_to :parent, :class_name => name, :foreign_key => configuration[:foreign_key], :counter_cache => configuration[:counter_cache] 62: has_many :children, :class_name => name, :foreign_key => configuration[:foreign_key], :order => configuration[:order] 63: 64: include DataMapper::Is::Tree::InstanceMethods 65: 66: class_eval "def self.roots\nself.all :\#{configuration[:foreign_key]} => nil, :order => \#{configuration[:order].inspect}\nend\n\ndef self.first_root\nself.first :\#{configuration[:foreign_key]} => nil, :order => \#{configuration[:order].inspect}\nend\n" 67: 68: class << self 69: alias_method :root, :first_root # for people used to the ActiveRecord acts_as_tree 70: end 71: end