Esta parece una pregunta realmente simple, pero no la he visto respondida en ninguna parte.
En rieles si tienes:
class Article < ActiveRecord::Base
has_many :comments
end
class Comments < ActiveRecord::Base
belongs_to :article
end
¿Por qué no puedes ordenar los comentarios con algo como esto?
@article.comments(:order=>"created_at DESC")
El alcance con nombre funciona si necesita hacer muchas referencias e incluso las personas hacen cosas como esta:
@article.comments.sort { |x,y| x.created_at <=> y.created_at }
Pero algo me dice que debería ser más sencillo. ¿Qué me estoy perdiendo?
ruby-on-rails
Brian Armstrong
fuente
fuente
Respuestas:
Puede especificar el orden de clasificación para la colección básica con una opción en
has_many
sí misma:O, si desea un método de clasificación simple que no sea de base de datos, use sort_by :
Recopilando esto con los métodos de pedido agregados por ActiveRecord:
Su kilometraje puede variar: las características de rendimiento de las soluciones anteriores cambiarán enormemente según cómo esté obteniendo datos en primer lugar y qué Ruby esté utilizando para ejecutar su aplicación.
fuente
-> { order(created_at: :desc) }
. Ver: stackoverflow.com/questions/18284606/…A partir de Rails 4, harías:
Para una
has_many :through
relación, el orden de los argumentos es importante (debe ser el segundo):Si siempre va a querer a los comentarios de acceso en el mismo orden sin importar el contexto también se puede hacer esto a través de
default_scope
dentroComment
como:Sin embargo, esto puede ser problemático por las razones discutidas en esta pregunta .
Antes de Rails 4, podía especificar
order
como clave en la relación, como:Como mencionó Jim, también puede usar
sort_by
después de haber obtenido los resultados, aunque en cualquier conjunto de resultados de tamaño, esto será significativamente más lento (y usará mucha más memoria) que hacer su pedido a través de SQL / ActiveRecord.Si está haciendo algo en el que agregar un orden predeterminado es engorroso por algún motivo o si desea anular el predeterminado en ciertos casos, es trivial especificarlo en la acción de búsqueda en sí:
fuente
.order()
a la cadena de métodos, como en el último ejemplo. ¿Es esto lo que estás preguntando?Si está utilizando Rails 2.3 y desea utilizar el mismo orden predeterminado para todas las colecciones de este objeto, puede utilizar default_scope para ordenar su colección.
Entonces si llamas
Se ordenarán según su default_scope. TBH en un sentido muy general, ordenar es el único uso realmente bueno de los ámbitos predeterminados.
fuente
Puede usar el método de búsqueda de ActiveRecord para obtener sus objetos y ordenarlos también.
http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html
fuente
Y si necesita pasar algunos argumentos adicionales como
dependent: :destroy
o lo que sea, debe agregar los que están después de una lambda, así:fuente