tutorial rails español ejemplos descargar crear con caracteristicas ruby-on-rails ruby activerecord arel

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) }

( más información aquí )