2012-01-16 6 views
13

I have 3 tables - users, things, and follows. Gli utenti possono seguire le cose attraverso la tabella seguente, associando uno user_id con uno things_id. Ciò significherebbe:Sono necessari i dati dalla barra di rotaia join table, has_many: through

class User 
    has_many :things, :through => :follows 
end 

class Thing 
    has_many :users, :through => :follows 
end 

class Follow 
    belongs_to :users 
    belongs_to :things 
end 

Così posso recuperare thing.users senza alcun problema. Il mio problema è se nella tabella seguente, ho una colonna denominata "relazione", quindi posso impostare un follower come "admin", voglio avere accesso a quella relazione. Quindi in un ciclo posso fare qualcosa del tipo:

<% things.users.each do |user| %> 
    <%= user.relation %> 
<% end %> 

C'è un modo per includere la relazione nell'oggetto utente originale? Ho provato :select => "follows.relation", ma non sembra unirsi all'attributo.

+2

È davvero una cattiva idea denominare una relazione "relazione" ... Questo può rompere alcuni interni rubino e si otterrà un comportamento inaspettato! – Lichtamberg

+0

OK, grazie. Diciamo che la colonna è chiamata "is_admin" e ha un tipo di booleano .. –

risposta

22

Per fare ciò è necessario utilizzare un po 'di SQL in has_many. Speriamo che qualcosa del genere funzioni. has_many :users, :through => :follows, :select => 'users.*, follows.is_admin as is_follow_admin'

Poi nel ciclo si dovrebbe avere accesso a user.is_follow_admin

+0

Funziona sicuramente, ed è essenzialmente ciò che stavo provando prima. Il mio rammarico era che il dump SQL quando si esegue questa operazione sulla riga di comando non mostra l'attributo is_admin da nessuna parte ... mostra solo l'oggetto follows. Grazie! –

+0

+1 - Bradley Priest, l'hai fatto di nuovo. –

+0

+1 Risparmio di tempo enorme e molto elegante, grazie! –

0

Potreste essere in grado di fare qualcosa di simile:

<% things.follows.each do |follow| %> 
    <%= follow.relation %> 
    <%= follow.user %> 
<% end %> 
8

Per chi utilizza i binari 4, l'utilizzo di: ordine,: select, etc è stato deprecato. Ora è necessario specificare come segue:

has_many :users, -> { select 'users.*, follows.is_admin as is_follow_admin' }, :through => :follows