2012-06-27 10 views
5

Estoy usando Ruby on Rails 3.2.2 y me gustaría saber si en los métodos de ámbito es posible unir "dinámicamente" una tabla solo si esa tabla aún no está unida. Que, no tengo:¿Es posible unir "dinámicamente" una tabla solo si esa tabla aún no está unida?

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

me gustaría hacer algo como lo siguiente:

# 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 

¿Es posible/aconseja hacer eso? Si es así, ¿cómo puedo/debo proceder?


me gustaría utilizar este enfoque con el fin de evitar multiple database table statements in INNER JOIN of SQL queries (en algunos casos parece que tiene mi SQL consulta no funciona como se esperaba ya que múltiples declaraciones de mesa) y así utilizar el scope_method_name sin preocuparse preocupaciones relacionadas con consultas SQL (en mi caso, sin importarme unir las tablas de la base de datos).

Nota: Podría aumentar los errores de SQL (por ejemplo, errores como-como "ActiveRecord::StatementInvalid: Mysql2::Error: Unknown column 'joining_table_name.user_id' in 'where clause'") cuando se tiene no se unió aún la tabla de base de datos (por ejemplo, esto podría suceder cuando se ejecuta código como ClassName.scope_method_name(@user)sin para unir previamente el joining_association_name y así sin unirse a la tabla relacionada joining_table_name).

Respuesta

-1

Dónde está el método loaded? para verificar si se ha cargado una asociación. Podrías tratar de usar eso.

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

¿Sus errores SQL código de evitar (por ejemplo, errores como-como "Usted tiene un error en la instrucción SQL: tabla' joining_table_name' no se especifica en la consulta SQL o tabla que no existe en el base de datos ") cuando * aún no se ha unido * a la tabla de la base de datos (por ejemplo, esto podría suceder cuando ejecuta código como' ClassName.scope_method_name (@user) '* sin antes * unir el' joining_association_name' y así sin unir la tabla relacionada 'joining_table_name')? – user12882

+0

Lo siento, acabo de ver que estás tratando de usar un alcance. 'association_name.loaded?' solo estaría disponible para una instancia. No puedo responder a tu pregunta ... pero los rieles deberían encargarse de no cargar una asociación dos veces. – spas

+0

Parece que a Rails no le importa "no cargar una asociación dos veces", al menos en el caso de [la pregunta vinculada] (http://stackoverflow.com/questions/11210241/what-means-happens-when -using-the-inner-join-with-multiple-database-table-st? lq = 1) (leer comentarios). – user12882

Cuestiones relacionadas