rails / acts_as_tree Goto Github PK
View Code? Open in Web Editor NEWNOTICE: official repository moved to https://github.com/amerine/acts_as_tree
Home Page: http://rubyonrails.org
NOTICE: official repository moved to https://github.com/amerine/acts_as_tree
Home Page: http://rubyonrails.org
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
In ActiveSupport 2.3.8, the parent method is defined in the Module class which conflicts with the acts_as_tree parent method.
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
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
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.
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.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.