querying has_many relationships

I am trying to build a small database of Universities, Departments and Courses. But for some reason I can't seem to get a list of courses attached to a Department.

So far I have the following Database: => Course(id: integer, course_name: string, length: integer, description: text, programme: string, department_id: integer, university_id: integer, created_at: datetime, updated_at: datetime)

=> Department(id: integer, department_name: string, department_description: text, head_firstname: string, head_lastname: string, head_email: string, university_id: integer, courses_id: integer, created_at: datetime, updated_at: datetime)

=> University(id: integer, name: string, website: string, country: string, city: string, departments_id: integer, courses_id: integer, created_at: datetime, updated_at: datetime)

Models: class Course < ActiveRecord::Base   belongs_to :department   belongs_to :university end class Department < ActiveRecord::Base   belongs_to :university   has_many :courses end class University < ActiveRecord::Base   has_many :departments   has_many :courses end

For the Department I am trying to run the following controller   def index     @departments = Department.includes(:courses, :university)

and the following view: <% @departments.each do |department| %>   <tr>     <td><%= department.department_name %></td>     <td><%= department.department_description %></td>     <td><%= department.head_firstname %></td>     <td><%= department.head_lastname %></td>     <td><%= department.head_email %></td>     <td><%= department.university.name %></td>     <td><%= department.courses %>

that last line outputs #<Course:0x1042b8270> and it fails when i try to add something like department.courses.course_name

I am at a loss here and haven't been able to find any clues on the documentation as to what I might be doing wrong. If anyone could at least point me in the right direction, that would be great.

Because department.courses is a collection of courses and doesn't have a course_name attribute (although the objects in that collection will do). You either need to pick which course you want to manipulate all iterate over them (similarly, you can't do @departments.department_name - you had to iterate over the departments in that collection)

Fred

I suspect department.courses returns and array and when you print it out you get the address of the first entry in the array.

That would also explain department.courses.course_name would fail because you have to index into the department.courses array like department.courses.course_name to be able to set it

I am trying to build a small database of Universities, Departments and Courses. But for some reason I can't seem to get a list of courses attached to a Department.

So far I have the following Database: => Course(id: integer, course_name: string, length: integer, description: text, programme: string, department_id: integer, university_id: integer, created_at: datetime, updated_at: datetime)

=> Department(id: integer, department_name: string, department_description: text, head_firstname: string, head_lastname: string, head_email: string, university_id: integer, courses_id: integer, created_at: datetime, updated_at: datetime)

=> University(id: integer, name: string, website: string, country: string, city: string, departments_id: integer, courses_id: integer, created_at: datetime, updated_at: datetime)

Models: class Course < ActiveRecord::Base belongs_to :department belongs_to :university

You don't need course belongs_to university, because course belongs_to department and department belongs_to university. So the university for a course is course.department.university. That is on the assumption that the university the course belongs to is the same one that it's department belongs to.

end class Department < ActiveRecord::Base belongs_to :university has_many :courses end class University < ActiveRecord::Base has_many :departments has_many :courses end

For the Department I am trying to run the following controller def index @departments = Department.includes(:courses, :university)

and the following view: <% @departments.each do |department| %> <tr> <td><%= department.department_name %></td> <td><%= department.department_description %></td> <td><%= department.head_firstname %></td> <td><%= department.head_lastname %></td> <td><%= department.head_email %></td> <td><%= department.university.name %></td> <td><%= department.courses %>

that last line outputs #<Course:0x1042b8270> and it fails when i try to add something like department.courses.course_name

I see Fred has pointed out the problem here already.

Colin

Skt, Fred, Collin, thank you!

The following code was enough to get the view working:

<% department.courses.each do |course| %> <%= course.course_name %> <% end %>

I am very new to both ruby and rails so I tend to miss a few key concepts, as was the case.

Thank you again :slight_smile:

It'd be interesting if AssociationProxy added in pluralised attribute names as easy go-to's for mappings, hey?

for example:

department.courses.course_names

(yields the same result as:...)

department.courses.map{|course| course.course_name}

Julian Leviston wrote in post #964556:

It'd be interesting if AssociationProxy added in pluralised attribute names as easy go-to's for mappings, hey?

No. What would be the point?

for example:

department.courses.course_names

(yields the same result as:...)

department.courses.map{|course| course.course_name}

Why? So you don't have to think about what you're doing? Or is there a good reason that escapes me?

---------------------------------------------- Buy my new album! 16 Sep 2010: http://itunes.apple.com/au/album/erste-zeit/id393326346

Cool! Nice to see other musicians here.

Best,