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