Forum: Ruby on Rails Newbie - ActiveRecord relationships

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
Nick (Guest)
on 2006-03-21 19:13
So I've worked through Agile Web D. with Rails and I'm now
trying my first little app to get into the swing of things. Its a task
tracking app where people can create tasks and assign them to others,
and also log time against the tasks.

I'm having trouble working out the model relationships. This is what
I've got so far, but its not right as I'm getting lots of errors when I
try to view a task:

class Client < ActiveRecord::Base

  has_many :tasks
...

class Log < ActiveRecord::Base

  belongs_to :users
  belongs_to :tasks
...

class User < ActiveRecord::Base

  has_many :tasks
  has_and_belongs_to_many :tasks
  has_many :logs
  has_many :users, :through => :logs
...

class Task < ActiveRecord::Base

  belongs_to :client
  belongs_to :user
  has_and_belongs_to_many :users
  has_and_belongs_to_many :parents,
    :class_name => "Task",
    :join_table => "parents_task",
    :association_foreign_key => "parent_id",
    :foreign_key => "task_id"
  has_many :logs
  has_many :users, :through => :logs
...

My db schema is below. If anyone has some pointers for me I'd REALLY
appreciate it.

Thanks
Nick

CREATE TABLE `tasks` (
  `id` int(4) NOT NULL auto_increment,
  `parent_id` int(4) default NULL, #Parent task
  `title` varchar(100) NOT NULL default '',
  `description` text NOT NULL,
  `estimated_hours` int(4) NOT NULL default '0',
  `start_on` date default NULL,
  `due_on` date NOT NULL default '0000-00-00',
  `user_id` int(4) NOT NULL default '0', #Task owner
  `client_id` int(4) NOT NULL default '0',
  `type_id` int(4) NOT NULL default '0',
  `urgent` tinyint(4) default NULL,
  `on_hold` tinyint(4) default NULL,
  `percent_complete` int(4) NOT NULL default '0',
  PRIMARY KEY  (`id`),
  KEY `parent_id` (`parent_id`),
  KEY `client_id` (`client_id`),
  KEY `type_id` (`type_id`),
  KEY `user_id` (`user_id`)
) TYPE=InnoDB AUTO_INCREMENT=1 ;

#For M:M relationship between tasks and users, for the task assignment
CREATE TABLE `tasks_users` (
  `user_id` int(4) NOT NULL default '0',
  `task_id` int(4) NOT NULL default '0',
  `assigned_on` datetime NOT NULL default '0000-00-00 00:00:00',
  KEY `user_id` (`user_id`),
  KEY `task_id` (`task_id`)
) TYPE=InnoDB;

CREATE TABLE `users` (
  `id` int(4) NOT NULL auto_increment,
  `firstname` varchar(100) NOT NULL default '',
  `surname` varchar(100) NOT NULL default '',
  `hashed_password` varchar(100) NOT NULL default '',
  `email` varchar(100) NOT NULL default '',
  `active` tinyint(1) NOT NULL default '1',
  PRIMARY KEY  (`id`)
) TYPE=InnoDB AUTO_INCREMENT=1 ;

CREATE TABLE `logs` (
  `id` int(4) NOT NULL auto_increment,
  `user_id` int(4) NOT NULL default '0',
  `task_id` int(4) NOT NULL default '0',
  `hours` decimal(8,2) NOT NULL default '0.00',
  `worked_on` date NOT NULL default '0000-00-00',
  `logged_at` datetime NOT NULL default '0000-00-00 00:00:00',
  PRIMARY KEY  (`id`),
  KEY `user_id` (`user_id`),
  KEY `task_id` (`task_id`)
) TYPE=InnoDB AUTO_INCREMENT=1 ;

CREATE TABLE `task_types` (
  `id` int(4) NOT NULL auto_increment,
  `title` varchar(100) NOT NULL default '',
  PRIMARY KEY  (`id`)
) TYPE=InnoDB AUTO_INCREMENT=17 ;

CREATE TABLE `clients` (
  `id` int(4) NOT NULL auto_increment,
  `name` varchar(100) NOT NULL default '',
  `contact` varchar(100) default NULL,
  `contact_email` varchar(100) default NULL,
  `contact_phone` varchar(30) default NULL,
  PRIMARY KEY  (`id`)
) TYPE=InnoDB AUTO_INCREMENT=1 ;

# Constraints for table `logs`
ALTER TABLE `logs`

  ADD CONSTRAINT `0_243` FOREIGN KEY (`user_id`) REFERENCES `users`
(`id`),
  ADD CONSTRAINT `0_244` FOREIGN KEY (`task_id`) REFERENCES `tasks`
(`id`);

# Constraints for table `tasks`
ALTER TABLE `tasks`

  ADD CONSTRAINT `0_315` FOREIGN KEY (`type_id`) REFERENCES `task_types`
(`id`),
  ADD CONSTRAINT `0_307` FOREIGN KEY (`parent_id`) REFERENCES `tasks`
(`id`),
  ADD CONSTRAINT `0_309` FOREIGN KEY (`user_id`) REFERENCES `users`
(`id`),
  ADD CONSTRAINT `0_312` FOREIGN KEY (`client_id`) REFERENCES `clients`
(`id`);
Nick C. (Guest)
on 2006-03-21 20:00
Nick wrote:
> but its not right as I'm getting lots of errors when I
> try to view a task:

The error was "Superclass mismatch on class Log". Removing all the
relationships to and from class log lets the app run again.

But what is the correct way to set up the log relationship? 1 user can
create many log entries for a task, and a task can have multiple entries
from many users.

thx.
Jeff C. (Guest)
on 2006-03-21 20:07
Nick C. wrote:
> Nick wrote:
>> but its not right as I'm getting lots of errors when I
>> try to view a task:
>
> The error was "Superclass mismatch on class Log". Removing all the
> relationships to and from class log lets the app run again.
>
> But what is the correct way to set up the log relationship? 1 user can
> create many log entries for a task, and a task can have multiple entries
> from many users.
>
> thx.

Could it have to do with the syntax of belongs_to?

I believe "belongs_to" is meant to refer to the singular form of your
model name--under Log you have "belongs_to :users" and ":tasks".

Jeff
Nick C. (Guest)
on 2006-03-21 20:11
Jeff C.man wrote:
>
> Could it have to do with the syntax of belongs_to?
>
> I believe "belongs_to" is meant to refer to the singular form of your
> model name--under Log you have "belongs_to :users" and ":tasks".
>
> Jeff

You're right. I fixed that now, but unfortunately I still get the same
error :(

#{RAILS_ROOT}/app/models/log.rb:1
(eval):5:in `has_many'
#{RAILS_ROOT}/app/models/user.rb:7
(eval):5:in `belongs_to'
#{RAILS_ROOT}/app/models/task.rb:4
#{RAILS_ROOT}/app/controllers/front/tasks_controller.rb:8:in `list'
#{RAILS_ROOT}/app/controllers/front/tasks_controller.rb:3:in `index'
-e:3:in `load'
-e:3

This error occured while loading the following files:
   task.rb
   user.rb
   log.rb
This topic is locked and can not be replied to.