2011-05-03 10 views
12

Viniendo de Rails 2 a Rails 3 Nunca he trabajado tan duro para entender algo (editorial lateral).Alcance con combinaciones para obtener datos en Rails 3

De todos modos, en una aplicación Rails 3 tengo los siguientes modelos ...

usuario:

has_many :answers 

Respuesta:

belongs_to :user 
belongs_to :question 
scope :user_answers, where (:user_id => current_user.id) 

Pregunta:

has_many :answers 
scope :qs_w_user_ans, joins(:questions) & (:user_answers) 

El error actual me estoy poniendo g es el "método indefinido` includes_values ​​'for: user_answers: Symbol "

Existe un id. de pregunta y una identificación de usuario. Cada respuesta tiene question_id y user_id.

Necesito las preguntas con las respuestas de un usuario debidamente vinculadas a través de los identificadores. ¿Puedes mostrarme dónde están mis modelos equivocados?

Gracias.

Respuesta

15

El & operador (que creo que recientemente está en desuso) es un alias para merge, lo que le permite combinar esencialmente ámbitos. :user_answers no es un ámbito, por lo que no puede usar este método.

Como señaló Dinatih, puede llamar a combinaciones varias veces. En este caso, crear diferentes ámbitos para cada unión no le comprará mucho, por lo que su método se adapta a su caso.

Más información acerca de los ámbitos: http://archives.edgerails.info/articles/what-s-new-in-edge-rails/2010/02/23/the-skinny-on-scopes-formerly-named-scope/index.html

actualización

Lo siento por mi mala interpretación. :user_answers es un alcance, pero no lo está llamando correctamente en este caso. Desea lo siguiente:

scope :qs_w_user_ans, joins(:questions) & Answer.user_answers 

Al combinar ámbitos, llame a los ámbitos combinados como métodos de clase.

En el artículo he vinculado, el alcance :published en Post se fusiona con el alcance :published en User:

scope :published, lambda { 
    joins(:posts).group("users.id") & Post.published 
} 
+0

Gracias, @McStretch . Leí ese artículo ... pero volveré a leerlo para ver si me ayudará. – Jay

+0

Gracias, @McStretch. ¿Por qué "user_answers" no es un alcance? Pensé que usar "alcance" lo convertía en un ámbito. ¿Lo viste en el modelo de Respuesta? – Jay

+0

@Jay - no, lo siento, me lo perdí. Actualizaré mi respuesta para reflejar mi nuevo entendimiento. – McStretch

-1
joins(:questions).joins(:user_answers) 
Cuestiones relacionadas