Comment commander les éléments inclus dans Rails 3
J'ai un modèle de relation où today
a beaucoup de tasks
Je suis en train de récupérer d'un utilisateur today
objet, comprennent la tasks
et de les rendre tous Json. Tout cela allait très bien jusqu'à ce que j'ai décidé que je voulais commander le tasks
dans le today
objet, car respond_with block
est également utilisé pour le rendu de la page html. Est-il possible d'inclure le tasks
et les commander?
Je suis en train d'essayer quelque chose comme ceci:
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
Cette récupère tout correctement, mais ne semble pas à l'ordre les tâches à tous.
C'est ce que j'ai utilisé (qui fonctionnait très bien, mais je n'avais pas la commande):
class TodaysController < ApplicationController
respond_to :html, :json
def show
@today = current_user.today
respond_with @today, :include => :tasks
end
end
Je sais que je peux récupérer les données et de les trier par la suite comme ceci:
@today = current_user.today
@today.tasks.sort!{|a,b| a.priority <=> b.priority }
Ce qui fonctionne et vais passer mes tests, mais je m'attendais à un ActiveRecord façon de résoudre ce problème.
- Concernant votre dernière ligne de code. La suite est un peu plus clair:
@today.tasks.sort_by(&:priority)
.
Vous devez vous connecter pour publier un commentaire.
Essayer dans votre
Today
modèle:EDIT: Comme mentionné dans le commentaire ci-dessous, dans les Rails 4+, c'est maintenant:
(plus d'info ici)
has_many :tasks, -> { order(:priority => :desc) }
lire iciDirect solution serait d'inclure la
tasks
nom de la table avant depriority
:Ou, si vous ne voulez pas d'avoir le nom de la table codé en dur, vous pouvez le fusionner avec le champ d'application de
Task
modèle:Vous pouvez également ajouter des
has_many: todays
àUser
modèle d'abandonner lewhere
clause et à faire:Mais si vous avez besoin seulement/est toujours à l'ordre par ordre de priorité, et n'ont pas besoin d'autres différents ordres, en ajoutant
order
àhas_many :tasks
est plus facile.references
avecincludes
pour indiquer que vous utilisez la table de la requête. Donc, il devrait être quelque chose commeToday.where(:user_id => current_user.id).includes(:tasks).references(:tasks).merge(Task.order(:priority)).first