Justin Christian
2006-Mar-29 11:17 UTC
[Rails] has_and_belongs_to_many and collections management
Sorry for the big post. I''m having a lot of confusion when trying to
implement a simple model relationship that uses all the good things of
ActiveRecord.
I need to store some dinamic entries about knowledge of certain people on
the database. A knowledge is measured with another table, with a range of
possible values for a knowledge. This is a reduced schema of my database:
create table people (
id int not null auto_increment,
name varchar(255) not null,
primary key (id)
);
create table knowledges (
id int not null auto_increment,
name varchar(255) not null,
primary key (id)
);
create table experiences (
id int not null auto_increment,
name varchar(255) not null,
primary key (id)
);
create table experiences_people (
person_id int not null,
knowledge_id int not null,
experience_id int not null
);
Let''s insert some default values:
insert into knowledges (name) values ("Books");
insert into knowledges (name) values ("Music");
insert into knowledges (name) values ("Sports");
insert into experiences (name) values ("Bad");
insert into experiences (name) values ("Medium");
insert into experiences (name) values ("Good");
And this are my models for this application:
class Person < ActiveRecord::Base
has_and_belongs_to_many :knowledges
end
class Knowledge < ActiveRecord::Base
has_and_belongs_to_many :people
end
class Experience < ActiveRecord::Base
end
This is why I need for the user interface:
* During a user (person) creation, I need to display a page with a list of
all possible knowledges and a dropdown list for each one (with, of course,
all possible experience values).
* During a user (person) edition, I need the same as before, but of course
with stored values for each knowledge already selected, and with the
possibility of change one or more values at the same time, storing that new
values on the database (with substitution of old values, if they exists, or
creating new entries for new values).
* During a knowledge view, a list with all people that has a value for that
knowledge, displaying the experience for each one.
And this is what I started to code:
* For person creation, I have the following in people_controller.rb on
method "new":
class PeopleController < ApplicationController
def new
@person = Person.new(@params[:person])
@knowledges = Knowledge.find(:all, :order =>
''name'').collect { |k| [
k.name, k.id ] }
@experiences = Experience.find(:all, :order =>
''name'').collect { |k| [
k.name, k.id ] }
if @request.post?
@knowledges = @params[:knowledges]
for knowledge in @knowledges
new_knowledge = Knowledge.new
## In fact, I need to create a new entry in experiences_knowledges
with
## the knowledge id and the experience id selected. How can I do that?
@person.knowledges << knowledge
end
if @person.save
flash[''notice''] = ''Person was successfully
created.''
redirect_to :action => ''show'', :id => @person.id
end
end
end
And this is my new.rhtml view:
<%= start_form_tag :action => "new" %>
<!--[form:people]-->
<table>
<tr>
<td>Name:</td>
<td><%= text_field("person", "name")
%></td>
</tr>
<% for knowledge in @knowledges %>
<tr>
<td><%= knowledge.name %></td>
<td><%= select ''knowledges_ids'', knowledge.id,
@experiences, {
:include_blank => true } %></td>
</tr>
<% end %>
</table>
<%= end_form_tag %>
As you can see, there is a comment on the controller code where must be the
creation of that entry. And I don''t know how to add knowledge entry to
@
person.knowledges collection. I have the same (but more difficult to me)
problem when I think in coding edit action, where I''ll need to edit a
knowledge that is already on the collection.
And for the list of people that has a value for a certain knowledge, I
suposse that it''s possible to use the ''people''
accessor to get the people
collection associated with the person object. But how can I get the
experience associated with that person and knowledge to display it?
Thanks in advance for reading to here. Any suggestion will be really
thankfull.
-------------- next part --------------
An HTML attachment was scrubbed...
URL:
http://wrath.rubyonrails.org/pipermail/rails/attachments/20060329/48df2a41/attachment-0001.html
