2009-04-19 6 views
7

J'ai une page d'index dans laquelle je souhaite afficher le profil de tous les utilisateurs et leurs photos associées. J'utilise le plugin Paperclip pour les photos. Dans le contrôleur de profils, j'ai la variable d'instance @profile mais elle me montre la table dans la table de profils seulement et pas la table de photos.Ruby on Rails: Comment joindre deux tables

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

Les modèles sont présentés ci-dessous:

class Profile < ActiveRecord::Base 
    has_many :photos 
end 

class Photo < ActiveRecord::Base 
    belongs_to :profile 
end 

Ce que je veux être en mesure de montrer dans la vue est quelque chose comme:

  • Profil de John (par exemple, le nom, l'âge, sexe) - Photo de John (p.ex., une seule photo affichée)
  • Le profil de Mary ici - la photo de Mary montrée ici
  • Le profil de Bob ici - l'image de Bob montrée ici
+0

Si un profil a beaucoup de photos, comment voulez-vous déterminer quelle image montrer pour un profil particulier? Est-ce que cela devrait être une relation un-à-un? (Il y aurait plusieurs façons de faire cela dans la base de données - Profil pourrait avoir une clé étrangère pour profile_photo, par exemple, ou il pourrait y avoir une colonne booléenne dans Photos indiquant si une photo particulière est destinée à être "primaire") –

+0

Oui, j'ai une colonne booléenne appelée primaire. Si la valeur est définie sur 1, la photo doit s'afficher. – Max

Répondre

15

J'ai édité ma réponse pour refléter vos commentaires supplémentaires.

Tout d'abord, vous ne devriez pas avoir besoin du paramètre :joins; :include => :photos devrait gérer la jointure "en coulisses" pour vous.

Voici une façon de faire ce que vous demandez.

(dans les modèles)

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

(dans le contrôleur)

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

(dans la vue)

<% @profiles.each do |profile| %> 
    Name: <%= profile.name %> 
    Age: <%= profile.age %> 
    Photo: <%= image_tag profile.primary_photo.url %> 
<% end %> 
+0

J'ai une colonne booléenne appelée primaire dans la table Photos. Est-il possible d'afficher la photo uniquement si la colonne principale est définie sur 1? Ajout de la ligne <% = if photo.primary = 1%> après le tag profile.photos.each ne semble pas fonctionner. – Max

+0

Ok, ça marche maintenant. Je devrais utiliser tinyint au lieu de int pour la colonne primaire dans la base de données. – Max