Giter Club home page Giter Club logo

acts_as_tree's Introduction

acts_as_tree
============

Specify this +acts_as+ extension if you want to model a tree structure by providing a parent association and a children
association. This requires that you have a foreign key column, which by default is called +parent_id+.

  class Category < ActiveRecord::Base
    acts_as_tree :order => "name"
  end

  Example:
  root
   \_ child1
        \_ subchild1
        \_ subchild2

  root      = Category.create("name" => "root")
  child1    = root.children.create("name" => "child1")
  subchild1 = child1.children.create("name" => "subchild1")

  root.parent   # => nil
  child1.parent # => root
  root.children # => [child1]
  root.children.first.children.first # => subchild1

Copyright (c) 2007 David Heinemeier Hansson, released under the MIT license  

acts_as_tree's People

Contributors

dhh avatar jeremy avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

acts_as_tree's Issues

Usefull methods?

Hi. What about adding some usefull methods to your plug in:
leafs: returns only the last elements of a tree for a given knot
structure: returns the given knot and all elements under the knot

Hereby a suggestion of code - it works pretty nice:

module ActiveRecord
module Acts
module Tree
module ClassMethods
def structure(knot=find(0)) #Returns an array of knot and all elements under knot
y = Array.new
y[0] = knot
if y[0].children.first then
looping(y, knot)
end
return y
end
def leafs(knot=find(0)) #Returns only the last elements of your tree under the tree object knot
@@tmp = structure(knot)
@leafs = Array.new
@@tmp.each do |i|
if not (i.children.first) then
@leafs[@leafs.size] = i
end
end
return @leafs
end
private
def looping(y, parent)
t = Array.new
t = parent.children
t.each do |i|
y[y.size] = i
if i.children.first then
looping(y, i)
end
end
end
end
end
end
end

Graph like behaviour

I can store a relation that is a graph in fact. Is it expected? I think it should throw an exception when there is a recycling path (For example A->B->A->B....). Here is the test (please note that this test passes; however i am expecting it to fail):

category = Category.new
category.name="Parent"
category.save
child = category.children.create("name" => "child_1")
child.children = [category]
assert category.save
loadedChild = Category.find_by_name("child_1")
assert_equal "Parent", loadedChild.parent.name
assert_equal "Parent", loadedChild.children[0].name

I added following code snippet to my domain object: (i am new to ruby so may be this is not the best way)

Although this seems alright with unit tests; when i test manually from browser; server dies due to infinite loop i guess.

validate :validate_recycling

def validate_recycling
begin
check_recycling []
rescue ArgumentError => msg
errors.add(:base, msg.message)
end
end

def check_recycling(parents)
raise ArgumentError, "#{self.name} is recycling!" if parents.include?(self)
copy = parents.dup
copy.push self
children.each { |child| child.check_recycling(copy) }
end

I guess the problem is before to validation, following lines (i found in the source code of the gem i installed) may run forever:

nodes << node = node.parent while node.parent

While loops have no recursion protection

If a page has one of its children defined as its parent, the methods 'root' and 'ancestors' will cause a time out.
Perhaps add error handling for if a node has already been in the loop, or just a limit to the number of levels to traverse.

support for autosave

I'd like to be able to use :autosave => true in the has_many :children association created by acts_as_tree so that I an modify a tree of objects and save them all from a single update_attributes call.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.