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 -~----------~----~----~----~------~----~------~--~---