I''m quite a newbie to Ruby and I need some help. I''ve got a
database
table called agents that looks something like this:
create table agents {
id mediumint(8) unsigned not null,
surname varchar(60),
forename varchar(60),
manager_id mediumint(8) unsigned,
primary key(id),
constraint fk_manager(manager_id)
references agents(id)
on delete restrict
on update restrict
}
This simple table represents a sales structrue. I''ve generated the
model
and I have an Agent Ruby class and added associations has_many agents
and belongs_to agent. I''ve added also a method called full_name that
just concatenates :surname and :forename.
I would now like to have the generated list view besides the surname and
forename of each agent also show the name of the manager ( manager is an
agent where id = agent.manager_id). There are some agents that don''t
have a manager aboven them.
I''ve added a method called manager_full_name to the Agent Ruby class to
avoid too much logic in the view. The code looks something like this:
def manager_full_name
manager = self.agent
manager_full_name = ''''
manager_full_name = manager.full_name unless manager == Nil
manager_full_name
end
I use the <%= agent.manager_full_name => in my list view but it always
prints out nothing.
How can I print out the name of the manager in the view? Can I use
simple instance variable like @manager_full_name to cach the name of the
manager? I want to avoid an extra query for each time an agent is
printed out.
The ideal way is to set the @manager_full_name instance variable at
creation time (I doesn''t go with the initialize method) and set a new
value when the agent is updated.
Another thing is how to display a structure (tree) of agents with each
agent on the right level. Something like this:
A1
|
A2 A7 A4
| | \
A9 A5 A7
It will quickly get ugly in the view... :-(
Any suggestions are welkom!
Thans in advance,
Mark
--
Posted via http://www.ruby-forum.com/.
--~--~---------~--~----~------------~-------~--~----~
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
-~----------~----~----~----~------~----~------~--~---
I think you will need to use acts_as_tree (or some other method like nested_set?) rather than using a circular belongs_to in the same class. Try this: class Agent < ActiveRecord::Base acts_as_tree :foreign_key => "manager_id" def manager_full_name manager = self.parent manager_full_name = '''' manager_full_name = manager.full_name unless manager == nil manager_full_name end end Note: the default foreign_key column to get the parent is parent_id but we can override that since you called it manager_id. Also, self.agent in your example becomes self.parent. There were a couple of typos in your example that you are probably aware of but here they are anyway: Nil should be lowercase nil and <%agent.manager_full_name => should be <%= @agent.manager_full_name %>. To retrieve the agent AND the parent from the database with a single query use the :include parameter as follows: @agent = Agent.find(2), :include => :parent). This will retrieve the agent row for id 2 along with it''s parent at the same time. I don''t have a good UI solution for displaying these in heirarchical order. Maybe someone else has tried it. -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 -~----------~----~----~----~------~----~------~--~---
Thanks a lot Paul, your solution with the acts_as_tree works great. I''ve found a also a nice article about it on http://brianfox.wordpress.com/2006/09/08/parent-and-child-assosiations-aka-acts-as-tree/#comment-3693 This code is just enough to get the manager''s name: manager_full_name = '''' manager_full_name = manager.full_name unless manager I''ve added the '':include => :parent'' to the ''edit'' and ''show'' action in the agents_controller. But I don''t know how you can add it to the ''list'' action when you do a Agent.find(:all). How can you get a list of agents and at the same time load the parent of each agent. I think you would have to write a custom SQL select statement if you want to avoid a query for getting the parent of each agent in the list. Code for displaying a tree structure in the GUI with ruby must exist somewhere. Let''s hope I can find it. Thanks, Mark -- Posted via http://www.ruby-forum.com/. --~--~---------~--~----~------------~-------~--~----~ 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 -~----------~----~----~----~------~----~------~--~---
>But I don''t know how you can add it to the ''list'' >action when you do a Agent.find(:all). How can you get a list of agents >and at the same time load the parent of each agent.Just do Agent.find(:all, :include => :parent). -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 -~----------~----~----~----~------~----~------~--~---