2011-03-18 8 views
36

tengo una relación modelo donde today tiene muchas taskselementos Cómo hacer un pedido incluidos en los carriles 3

Estoy tratando de recuperar el objeto de un usuario today, incluya el tasks y se los hacen a JSON. Todo esto fue genial hasta que decidí que quería pedir el tasks dentro del objeto today porque respond_with block también se usa para representar la página html. ¿Hay alguna manera de incluir el tasks y ordenarlos?

estoy intentando algo como esto:

class TodaysController < ApplicationController 
    respond_to :html, :json 
    def show 
    @today = Today.where(:user_id => current_user.id).joins(:tasks).includes(:tasks).order(:priority).first 
    respond_with @today, :include => :tasks 
    end 
end 

Esto recupera todo correctamente, pero no parece que ordenar las tareas en absoluto.

Esto es lo que solía tener (que funcionaba muy bien, pero no tienen el orden):

class TodaysController < ApplicationController 
    respond_to :html, :json 
    def show 
    @today = current_user.today 
    respond_with @today, :include => :tasks 
    end 
end 

sé que puedo recuperar los datos y ordenar que después de esta manera:

@today = current_user.today 
@today.tasks.sort!{|a,b| a.priority <=> b.priority } 

Esto funciona y pasará mis pruebas, pero esperaba una forma ActiveRecord para resolver esto.

+0

En cuanto a su última línea de código. Lo siguiente es un poco más claro: '@ today.tasks.sort_by (&: priority)'. – DNNX

Respuesta

49

Pruebe esto en su modelo Today:

has_many :tasks, :order => 'priority DESC' 

EDIT: Como se ha mencionado en el comentario a continuación, en Rails 4+, esto es ahora:

has_many :tasks, -> { order(:priority => :desc) } 

(more info here)

+0

Eso funcionó muy bien, gracias! – royvandewater

+5

¿No hay otra manera de hacer esto? – maletor

+24

En rieles 4 esto ahora está en desuso, el nuevo enfoque sería 'has_many: tasks, -> {order (: priority =>: desc)}' [lea sobre esto aquí] (http://stackoverflow.com/questions/ 18284606/deprecated-warning-for-rails-4-model-with-order) – Cluster

35

directa La solución sería incluir el nombre de tabla tasks antes de priority:

Today.where(:user_id => current_user.id).includes(:tasks).order('tasks.priority').first 
# joins(:tasks) is not required 

O, si usted no quiere tener el nombre de tabla codificada, puede combinar con un alcance de Task modelo:

Today.where(:user_id => current_user.id).joins(:tasks).includes(:tasks).merge(Task.order(:priority)).first 
# joins(:tasks) here is required 

Además, se puede añadir a has_many: todaysUser modelo para deshacerse de la cláusula where y hacer:

current_user.todays.includes(:tasks).order('tasks.priority').first 
# or 
current_user.todays.joins(:tasks).includes(:tasks).merge(Task.order(:priority)).first 

Pero si sólo necesita/siempre a la orden por prioridad, y no necesitan otros ordenamientos diferentes, añadiendo a orderhas_many :tasks es más fácil.

+1

No veo por qué es mejor agregar el orden al modelo. Me parece que ordenar es parte de la vista y no tiene nada que ver con ninguno de los modelos. –

+0

Es cierto. Quise decir más fácil. Editado – Jack

+0

@Jack 'Today.where (: user_id => current_user.id) .joins (: tasks) .includes (: tasks).merge (Task.order (: priority)). first' its not working on rails 4.2 – Gagan

Cuestiones relacionadas