2011-04-06 16 views
6

Digamos que tengo un modelo Questions y Answer y respondo todas las respuestas a una pregunta específica.Rieles: obtener ubicación de registros?

Puedo hacer fácilmente un each_with_index y averiguar cuál es el índice o "ubicación" de una respuesta (en relación con las otras respuestas a esa pregunta específica).

Pero, digamos que quiero obtener una respuesta específica ... ¿cómo podría averiguar cuál es el índice de esa respuesta en relación con todas las otras respuestas asociadas a una pregunta específica?

Ejemplo Answer datos:

ID text  question_id 
23 awesome 3 
27 boooyah 3 
38 snap  3 

Si lo hiciera Answer.find(27) cómo puedo averiguar ese registro es el segundo elemento (suponiendo que estoy ordenando por ID ... aunque podría ordenar por cualquier campo).

+0

es la posición es realmente importante para usted a continuación, sólo tiene que añadir una columna posición en la tabla. – corroded

+0

Pero debe ser dinámico. Como si hiciera un 'ORDER BY created_at', eso cambia la posición. No quiero mantenerlos en cierto orden, quiero averiguar dónde están en un orden específico. – Shpigford

+0

no a menos que haya guardado la posición en la base de datos como sugerí. si guardó la posición, boooyah siempre tendrá la posición 2, no importa cuál sea su consulta – corroded

Respuesta

6
class Answer < ActiveRecord::Base 
    belongs_to :question 

    def position(column = 'id', order = 'ASC') 
    order_by = "#{column} #{order}" 
    arrow = order.capitalize == "ASC" ? "<=" : ">=" 
    question.answers.where("#{column} #{arrow} (?)", self.send(column)).order(order_by).count 
    end  
end 

Answer.find(27).position 
Answer.find(27).position("updated_at") 
Answer.find(27).position("updated_at", "DESC") 
+0

Esto solo funcionaría para la clasificación por' id'. Hacer un pedido por otra cosa tendría el mismo efecto ya que aplica la condición 'where ('id <=?', Self.id)' siempre y luego obtiene el conteo. – ctcherry

+0

sí, mi culpa. – fl00r

+0

Ahora * eso * funcionará, y el 'conteo' acordado es más eficiente. – ctcherry

1

Algo como esto debería funcionar, no está probado pero puede ver el concepto.

class Answer < ActiveRecord::Base 

    belongs_to :question 

    def placement(ordering_by => 'id ASC') 
    question.answers.order(ordering_by).index(self) 
    end 

end 
+0

usando sql 'count' más perfomance efficient – fl00r

Cuestiones relacionadas