6

Tengo una configuración de modelo como el siguiente:Default_scope en una tabla de unión

class User 
    has_many :items 
    has_many :words, :through => :items 
end 

class Item 
    belongs_to :user 
    belongs_to :word 

    default_scope where(:active => true) 
end 

class Words 
    has_many :items 
end 

El problema que estoy teniendo es que el default_scope no se está aplicando a la siguiente asociación:

user.words 

en lugar de este SQL:

SELECT `words`.* FROM `words` INNER JOIN `items` ON `words`.id = `items`.word_id WHERE ((`items`.user_id = 1)) AND ((`items.active = 1)) 

consigo este SQL en los registros:

SELECT `words`.* FROM `words` INNER JOIN `items` ON `words`.id = `items`.word_id WHERE ((`items`.user_id = 1)) 

Me imagino que esto se debe a que el alcance predeterminado funciona para un modelo regular y su asociación secundaria, pero no para tablas de unión.

¿Cuál es la forma correcta de Rails de conseguir que un alcance de tabla de unión funcione entre asociaciones sin necesidad de especificarlo? ¿Existe uno?

Respuesta

10

Encontré la respuesta con la ayuda de dfr de # ruby-on-rails.

En la clase de usuario, establezca la relación has_many ser:

has_many :words, :through => :items, :conditions => { "items.active" => true } 

Esto es porque aunque hay una HABTM unirse asociación entre el Usuario y Word, el modelo de artículo no se carga realmente cuando user.words es llamado. Por lo tanto, debe aplicar el alcance en la asociación dentro del modelo de Usuario.

Espero que haya ayudado a alguien.

2

Gracias es útil. Este ticket (aunque no es válido) hace que la gente lo debata también: https://rails.lighthouseapp.com/projects/8994-ruby-on-rails/tickets/3610-has_many-through-associations-may-not-respect-default_scope-conditions#ticket-3610-17

Personalmente, siento que este ticket NO es inválido. El alcance predeterminado es el alcance predeterminado.

+0

Estoy de acuerdo. Parece que el modelo de unión debe cargarse cuando se llama a una asociación. Supongo que no es para optimizarlo. Sin embargo, creo que el modelo de unión es el lugar correcto para poner ese alcance, en lugar de simplemente colgar el método has_many en el modelo de usuario. – joeellis

Cuestiones relacionadas