2012-06-27 7 views
5

Sto usando Ruby on Rails 3.2.2 e vorrei sapere se nei metodi scope è possibile unire "dinamicamente" una tabella solo se quella tabella non è ancora unita. Che, ho:È possibile unire "dinamicamente" una tabella solo se quella tabella non è ancora unita?

def self.scope_method_name(user) 
    joins(:joining_association_name).where("joining_table_name.user_id = ?", user.id) 
end 

Mi piacerebbe fare qualcosa di simile al seguente:

# Note: the following code is just a sample in order to understand what I mean. 
def self.scope_method_name(user) 
    if table_is_joined?(joining_table_name) 
    where("joining_table_name.user_id = ?", user.id) 
    else 
    joins(:joining_association_name).where("joining_table_name.user_id = ?", user.id) 
    end 
end 

E 'possibile/consigliato di fare questo? Se sì, come/dovrei procedere?


Vorrei utilizzare questo approccio per evitare multiple database table statements in INNER JOIN of SQL queries (in alcuni casi sembra di fare il mio SQL interrogazione non funziona come previsto dal più istruzioni tavolo), e così di utilizzare la scope_method_name senza preoccuparsi problemi di query SQL correlati (nel mio caso, senza preoccuparsi di unire tabelle di database).

Nota: Si potrebbe generare errori SQL (ad esempio, gli errori come-like "ActiveRecord::StatementInvalid: Mysql2::Error: Unknown column 'joining_table_name.user_id' in 'where clause'") quando si ha non ancora aderito la tabella del database (ad esempio, questo potrebbe accadere quando si esegue il codice come ClassName.scope_method_name(@user)senza prima di unire il joining_association_name e così senza partecipare alla tabella joining_table_name correlata).

risposta

-1

Dove è il metodo loaded? per verificare se è stata caricata un'associazione. Potresti provare a usarlo.

if association_name.loaded? 
    where("joining_table_name.user_id = ?", user.id) 
else 
    joins(:joining_association_name).where("joining_table_name.user_id = ?", user.id) 
end 
+0

Will tuoi errori SQL codice di evitare (per esempio, gli errori come-like "Hai un errore nella vostra istruzione SQL: tabella' joining_table_name' non è specificato nella query SQL o quel tavolo non esiste nel database ") quando * non si è ancora unito * alla tabella del database (ad esempio, ciò potrebbe accadere quando si esegue un codice come' ClassName.scope_method_name (@user) '* senza prima * unirsi a' joining_association_name' e quindi senza partecipare la tabella 'joining_table_name' relativa)? – user12882

+0

Scusa, ho appena visto che stai cercando di usare un oscilloscopio. 'association_name.loaded?' sarebbe disponibile solo per un'istanza. Non posso rispondere alla tua domanda ... ma i binari dovrebbero fare attenzione a non caricare due volte un'associazione. – spas

+0

Sembra che a Rails non importi "di non caricare un'associazione due volte", almeno nel caso della [domanda collegata] (http://stackoverflow.com/questions/11210241/what-means-happens-when -using-the-inner-join-with-multiple-database-table-st? lq = 1) (leggi i commenti). – user12882