Ruby on Rails: How to join two tables

28,945

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 %>
Share:
28,945
Max
Author by

Max

Updated on September 25, 2020

Comments

  • Max
    Max over 3 years

    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
  • Max
    Max about 15 years
    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
    Max about 15 years
    Ok, it's working now. I should be using tinyint instead of int for the primary column in the database.