views:

3601

answers:

1

I have an index page that I want to show all the users' profile and their associated photos. I'm using the plugin Paperclip for the photos. In the Profiles controller, I have the instance variable @profile but it shows me the table in the profiles table only and not the photos table.

@profile = Profile.find(:all, :include => :photos,
  :joins => "INNER JOIN photos ON photos.profile_id = profiles.id")

The models are shown below:

class Profile < ActiveRecord::Base
  has_many :photos
end

class Photo < ActiveRecord::Base
  belongs_to :profile
end

What I want to be able to show in the View is something like:

  • John's profile (e.g., name, age, sex) - John's picture (e.g., only one picture shown)
  • Mary's profile here - Mary's picture shown here
  • Bob's profile here - Bob's picture shown here
+4  A: 

I've edited my answer to reflect your extra comments.

First of all, you shouldn't need the :joins parameter; :include => :photos should handle the join "behind the scenes" for you.

Here's one way to do what you're asking about.

(in the models)

class Profile < ActiveRecord::Base
  has_many :photos
  has_one :primary_photo, :class_name => "Photo", :conditions => {:primary => true}
end

(in the controller)

@profiles = Profile.find(:all, :include => :primary_photo)

(in the view)

<% @profiles.each do |profile| %>
  Name: <%= profile.name %>
  Age: <%= profile.age %>
  Photo: <%= image_tag profile.primary_photo.url %>
<% end %>
Greg Campbell
I have a boolean column called primary in the Photos table. Is there a way to display the photo only if the primary column is set to 1? Adding the line <%= if photo.primary = 1 %> after the profile.photos.each tag doesn't seem to work.
Max
Ok, it's working now. I should be using tinyint instead of int for the primary column in the database.
Max