ruby-on-rails - español - ruby on rails ejemplos
Cómo pedir elementos incluidos en Rails 3 (2)
Tengo una relación modelo donde today
tiene muchas tasks
Estoy tratando de recuperar el objeto today
un usuario, incluir las tasks
y presentarlas a Json. Todo esto fue genial hasta que decidí que quería ordenar las tasks
dentro del objeto today
porque el respond_with block
también se usa para representar la página html. ¿Hay alguna forma de incluir las tasks
y ordenarlas?
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 ordenar las tareas en absoluto.
Esto es lo que solía tener (que funcionó muy bien, pero no tenía 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 ordenarlos 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.
La solución directa sería incluir el nombre de la tabla de tasks
antes de la priority
:
Today.where(:user_id => current_user.id).includes(:tasks).order(''tasks.priority'').first
# joins(:tasks) is not required
O bien, si no desea que el nombre de la tabla esté codificado de forma rígida, puede fusionarlo con el alcance del modelo de Task
:
Today.where(:user_id => current_user.id).joins(:tasks).includes(:tasks).merge(Task.order(:priority)).first
# joins(:tasks) here is required
Además, puede agregar has_many: todays
al modelo de User
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 solo necesita / siempre para ordenar por prioridad, y no necesita otros pedidos diferentes, agregar order
a has_many :tasks
es más fácil.
Pruebe esto en su modelo de Today
:
has_many :tasks, :order => ''priority DESC''
EDITAR: como se menciona en el comentario a continuación, en Rails 4+, esto es ahora:
has_many :tasks, -> { order(:priority => :desc) }