pjvleeuwen-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org
2007-Apr-08 18:37 UTC
How-to: Hierarchical model object: Object with relation to it''s own class
Hi all please advice me on the ''proper'' way to handle the
questions
below. Any insight, best-practise or hint is very welcome. I use Ruby
for a while, but Rails is new to me.
==Initial code:
===My DB contains:
CREATE TABLE `posts` (
`id` int(10) unsigned NOT NULL auto_increment,
`name` varchar(50) NOT NULL,
`parent` int(10) unsigned default NULL,
`description` varchar(255) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `name` (`name`)
);
INSERT INTO `posts` VALUES (1, ''mainroot'', NULL, ''a
root-post without
a parent, but with childs'');
INSERT INTO `posts` VALUES (2, ''left trunk'', 1, ''this
root has a
parent and child'');
INSERT INTO `posts` VALUES (3, ''left leaf'', 2, ''a
leaf-post with
parent, but without child'');
INSERT INTO `posts` VALUES (4, ''right leaf'', 1, ''this
leaf-post has a
parent, but no child'');
===My model file post.rb contains:
class Post < ActiveRecord::Base
def Post::find_roots
all_posts = Post::find_all
all_posts.find_all {|post| not post.has_parent?}
end
def has_parent?
not @parent == nil
end
end
The DB has only an id of the parent post, so I try to map this to a
post-object like this:
class Post < ActiveRecord::Base
attr_reader :parent
def initialize(*args)
puts "TEST"
super(*args)
unless self.parent_id == nil
@parent = Post::get_id(self.parent_id)
else
@parent = nil
end
end
end
??When I run http://localhost:3001/Post/list I get a list of posts, so
so far so good but "TEST" is not printed, so it seems like
Post#initialize is never called. Is this true? And how to solve this?
===Controller-file:
class PostController < ApplicationController
scaffold :post
def list
@posts = Post::find_roots
puts @posts.length
end
end
By the way, the controller-file (above) doesn''t print the number of
root-posts, but prints the total number of posts. This is makes sence,
since Post#initialize above was never run...
Reading a bit more on internet about relations I find that the Rails''
way of handling relations is more like:
==New code:
===DB:
ALTER TABLE `posts` CHANGE `parent` `post_id` INT( 10 ) UNSIGNED NULL
DEFAULT NULL
This is a bit more cryptic, but Rails expects this name in the next
step.
??Is there any way to use a different fieldname here? ''Parent''
is a
lot more explaining then ''post_id''...
===New model-file:
class Post < ActiveRecord::Base
belongs_to :post
has_many :post
def Post::find_roots
all_posts = Post::find_all
all_posts.find_all {|post| not post.has_parent?}
end
def has_parent?
not self.post == nil
end
end
??For some reason this makes the controller (described above) return
zero. Is my Post#has_parent? correct? A test shows that it is called
for all elements, but the test contained is somehow wrong.
Basically: am I on the right by implementing the relation between Post
and parent-Post like this?
All insight and tips are welcome!
Cheers,
Paul
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"Ruby on Rails: Talk" group.
To post to this group, send email to
rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org
To unsubscribe from this group, send email to
rubyonrails-talk-unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org
For more options, visit this group at
http://groups.google.com/group/rubyonrails-talk?hl=en
-~----------~----~----~----~------~----~------~--~---
pjvleeuwen-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org
2007-Apr-08 20:28 UTC
Re: How-to: Hierarchical model object: Object with relation to it''s own class
I found the acts_as_tree keyword on http://www.railsforum.com/viewtopic.php?id=1560 that will probably make life a lot easier in the above scenario. Any comment is still welcome ofcourse. :) Cheers, Paul On 8 apr, 20:37, "pjvleeu...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org" <pjvleeu...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote:> Hi all please advice me on the ''proper'' way to handle the questions > below. Any insight, best-practise or hint is very welcome. I use Ruby > for a while, but Rails is new to me. > > ==Initial code: > ===My DB contains: > CREATE TABLE `posts` ( > `id` int(10) unsigned NOT NULL auto_increment, > `name` varchar(50) NOT NULL, > `parent` int(10) unsigned default NULL, > `description` varchar(255) NOT NULL, > PRIMARY KEY (`id`), > UNIQUE KEY `name` (`name`) > ); > INSERT INTO `posts` VALUES (1, ''mainroot'', NULL, ''a root-post without > a parent, but with childs''); > INSERT INTO `posts` VALUES (2, ''left trunk'', 1, ''this root has a > parent and child''); > INSERT INTO `posts` VALUES (3, ''left leaf'', 2, ''a leaf-post with > parent, but without child''); > INSERT INTO `posts` VALUES (4, ''right leaf'', 1, ''this leaf-post has a > parent, but no child''); > > ===My model file post.rb contains: > class Post < ActiveRecord::Base > def Post::find_roots > all_posts = Post::find_all > all_posts.find_all {|post| not post.has_parent?} > end > def has_parent? > not @parent == nil > end > end > > The DB has only an id of the parent post, so I try to map this to a > post-object like this: > class Post < ActiveRecord::Base > attr_reader :parent > def initialize(*args) > puts "TEST" > super(*args) > unless self.parent_id == nil > @parent = Post::get_id(self.parent_id) > else > @parent = nil > end > end > end > > ??When I runhttp://localhost:3001/Post/listI get a list of posts, so > so far so good but "TEST" is not printed, so it seems like > Post#initialize is never called. Is this true? And how to solve this? > > ===Controller-file: > class PostController < ApplicationController > scaffold :post > def list > @posts = Post::find_roots > puts @posts.length > end > end > > By the way, the controller-file (above) doesn''t print the number of > root-posts, but prints the total number of posts. This is makes sence, > since Post#initialize above was never run... > > Reading a bit more on internet about relations I find that the Rails'' > way of handling relations is more like: > ==New code: > ===DB: > ALTER TABLE `posts` CHANGE `parent` `post_id` INT( 10 ) UNSIGNED NULL > DEFAULT NULL > This is a bit more cryptic, but Rails expects this name in the next > step. > ??Is there any way to use a different fieldname here? ''Parent'' is a > lot more explaining then ''post_id''... > > ===New model-file: > class Post < ActiveRecord::Base > belongs_to :post > has_many :post > def Post::find_roots > all_posts = Post::find_all > all_posts.find_all {|post| not post.has_parent?} > end > def has_parent? > not self.post == nil > end > end > > ??For some reason this makes the controller (described above) return > zero. Is my Post#has_parent? correct? A test shows that it is called > for all elements, but the test contained is somehow wrong. > > Basically: am I on the right by implementing the relation between Post > and parent-Post like this? > > All insight and tips are welcome! > > Cheers, > Paul--~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk-unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---