2012-01-16 11 views
13

Mam 3 tabele - użytkownicy, rzeczy i następuje. Użytkownicy mogą postępować zgodnie z poniższą tabelą, wiążąc user_id z things_id. Oznaczałoby to:Potrzebujesz danych z tabeli łączenia szyn, has_many: przez

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 

Dzięki temu mogę odzyskać thing.users bez problemu. Mój problem polega na tym, że jeśli w poniższej tabeli mam kolumnę o nazwie "relacja", mogę ustawić wyznawcę jako "admin", chcę mieć dostęp do tej relacji. Tak więc w pętli mogę zrobić coś takiego:

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

Czy istnieje sposób włączenia relacji do oryginalnego obiektu użytkownika? Próbowałem :select => "follows.relation", ale nie wydaje się, aby dołączyć do atrybutu.

+2

To naprawdę zły pomysł, aby nazwać relację "relacja" ... Może to spowodować uszkodzenie niektórych wewnętrznych rubinów, a otrzymasz niespodziewane zachowanie! – Lichtamberg

+0

W porządku, dzięki. Powiedzmy, że kolumna nazywa się "is_admin" i ma typ boolean .. –

Odpowiedz

22

Aby to zrobić, należy użyć kodu SQL w has_many. Coś takiego powinno mieć nadzieję, że zadziała. has_many :users, :through => :follows, :select => 'users.*, follows.is_admin as is_follow_admin'

Następnie w pętli powinny mieć dostęp do user.is_follow_admin

+0

Zdecydowanie działa i jest zasadniczo tym, co próbowałem wcześniej. Moje powieszenie było takie, że zrzut SQL, gdy robi to w wierszu poleceń, nie pokazuje atrybutu is_admin w dowolnym miejscu. Pokazuje tylko następujący obiekt. Dziękuję Ci! –

+0

+1 - Bradley Priest, znowu to zrobiłeś. –

+0

+1 Ogromny oszczędność czasu i bardzo elegancki, dzięki! –

0

może być w stanie zrobić coś takiego:

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

Dla osób korzystających z szyn 4, korzystanie z: kolejności: select, etc został wycofany. Teraz musisz podać:

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