2009-04-19 20 views
7

Ho una pagina indice che voglio mostrare il profilo di tutti gli utenti e le loro foto associate. Sto usando il plugin Paperclip per le foto. Nel controller Profili, ho la variabile di istanza @profile ma mi mostra la tabella solo nella tabella dei profili e non la tabella delle foto.Ruby on Rails: come unire due tabelle

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

I modelli sono riportati di seguito:

class Profile < ActiveRecord::Base 
    has_many :photos 
end 

class Photo < ActiveRecord::Base 
    belongs_to :profile 
end 

Quello che voglio essere in grado di mostrare nella vista è qualcosa di simile:

  • profilo di Giovanni (ad esempio, il nome, l'età, sesso) - Foto di Giovanni (ad es., solo una foto)
  • Profilo di Mary qui - Immagine di Maria mostrata qui
  • Profilo di Bob qui - Immagine di Bob mostrata qui
+0

Se un profilo ha molte foto, come si fa a determinare quale immagine mostrare per un profilo particolare? Dovrebbe essere una relazione uno-a-uno? (Ci sarebbero diversi modi per farlo nel database - Il profilo potrebbe avere una chiave esterna per profile_photo, per esempio, o potrebbe esserci una colonna booleana in Foto che indica se una determinata foto è destinata a essere "primaria") –

+0

Sì, ho una colonna booleana chiamata primary. Se è impostato su 1, dovrebbe mostrare la foto. – Max

risposta

15

Ho modificato la mia risposta per riflettere i vostri commenti extra.

Prima di tutto, non è necessario il parametro :joins; :include => :photos dovrebbe gestire il join "dietro le quinte" per te.

Ecco un modo per fare ciò che stai chiedendo.

(nei modelli)

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

(nel controllore)

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

(nella visualizzazione)

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

Ho una colonna booleana chiamata primary nella tabella Foto. C'è un modo per visualizzare la foto solo se la colonna principale è impostata su 1? Aggiungere la riga <% = se photo.primary = 1%> dopo che il tag profile.photos.each non sembra funzionare. – Max

+0

Ok, sta funzionando ora. Dovrei usare tinyint invece di int per la colonna principale nel database. – Max