Asociación de registros activos con la condición de repetición named_scope

Tengo una relación como que el usuario tiene muchos artículos y los artículos pertenecen al usuario.
Entonces, para encontrar los artículos (que están activos) del usuario, agregué named_scope en el modelo de artículos

named_scope :active_articles, :conditions => "active = true"

y cuando hacer-

user.articles.active_articles

Da correctamente como se esperaba, pero en la consulta de la consola tiene una condición de repetición:

SELECT * FROM `articles` WHERE (`articles`.user_id = 52) AND ((active = true) AND (`articles`.user_id = 52))

¿Cómo restringir la repetición de la condición?
or
¿Cómo agregar condiciones a la asociación?

Estoy trabajando con Rails 2.3.5. Gracias de antemano.

preguntado el 04 de julio de 12 a las 08:07

Mi $0.02: confía en el optimizador de consultas y no te preocupes por eso. Si está utilizando una base de datos como PostgreSQL, puede "analizar" y ver que las dos consultas serán exactamente iguales (predigo). -

2 Respuestas

No estoy seguro, pero creo que la razón por la que se repite es porque la primera parte "user.articles generará DONDE (articles.user_id = 52)" y la segunda parte "articles.active_articles generará AND ((active = true) AND (articles.id_usuario = 52))"

así que cuando llamas a ambas partes user.articles.active_articles generará (articles.user_id = 52) Y ((activo = verdadero) Y (articles.id_usuario = 52))

¿Puede llamar a article.active_articles? y publicar el resultado?

Respondido 04 Jul 12, 08:07

¿Cómo funcionará? siempre da un método indefinido active_articles? - sandip karanjekar

Sí, lo siento, no escribí claramente, quiero decir que es posible que tengas que buscar el artículo específico y luego el artículo.artículos_activos, para que no se repita. - piama

Puede poner la siguiente asociación has_many en su modelo de usuario:

has_many :active_articles, :conditions => {:active => true }, :class_name => "Article"

Y luego acceda a los artículos activos a través de user.active_articles directamente.

Sé que no es tan bueno como named_scope en el modelo Article, pero elimina la duplicación de condicionales en la consulta SQL generada por ActiveRecord

Respondido 06 Jul 12, 11:07

Sí, esto funcionará, pero estoy buscando la mejor manera y por qué los rieles agregan condiciones adicionales. - sandip karanjekar

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.