2012-01-05 8 views
5

Tengo dos modelos ActiveRecord que tienen una asociación HABTM.¿Cómo obtener la tabla arel de una asociación habtm?

Quiero escribir un scope para obtener los registros huérfanos usando Arel.

Mi problema es que no pude encontrar un método para recuperar el arel_table de la asociación. Como la relación es HABTM, no hay ningún modelo para llamar al arel_table.

Tengo lo siguiente ahora (que funciona), pero hago una nueva tabla arel con el nombre de la tabla de unión (recuperada mediante el método reflect_on_association).

scope :orphans, lambda { 
    teachers = arel_table 
    join_table = Arel::Table.new(reflect_on_association(:groups).options[:join_table]) 

    join_table_condition = join_table.project(join_table[:teacher_id]) 
    where(teachers[:id].not_in(join_table_condition)) 
} 

Esto produce el siguiente SQL:

SELECT `teachers`.* 
FROM `teachers`  
WHERE (`teachers`.`id` NOT IN (SELECT `groups_teachers`.`teacher_id` 
           FROM `groups_teachers`)) 

Entonces, ¿hay alguna forma mejor para recuperar el arel_table en lugar de hacer una nueva?

+0

Nota, creo que hay una manera más clara de hacerlo, vea mi respuesta a continuación. – Andrew

Respuesta

2

Si conoce el nombre de la asociación y, por tanto, la mesa, que en este caso parece que lo hace, usted debe ser capaz de llamar a unirse:

Arel::Table.new(:groups_teachers) 

En mis pruebas que devuelve la tabla Arel de una asociación habtm. Gracias a this answer por señalarme esto.

+0

Al menos por ahora (mirando ARel 3.0.2 y AR 3.2) puedes hacer algunos deportes desagradables como 'Groups.reflect_on_association (: teachers) .through_reflection.klass.arel_table', que debería darte un objeto debidamente enlazado. – Nicos

+0

¡Ejemplo rápido si alguien está confundido! 'User.joins (: sports) .where (Arel :: Table.new (: sports_users) [: sport_id] .eq (SPORT_ID))' – Marrs

Cuestiones relacionadas