Esta parece uma pergunta muito simples, mas eu não vi uma resposta em lugar nenhum.
Nos trilhos, se você tiver:
class Article < ActiveRecord::Base
has_many :comments
end
class Comments < ActiveRecord::Base
belongs_to :article
end
Por que você não pode ordenar os comentários com algo assim:
@article.comments(:order=>"created_at DESC")
O escopo nomeado funciona se você precisar referenciá-lo muito e até mesmo as pessoas fazem coisas como isto:
@article.comments.sort { |x,y| x.created_at <=> y.created_at }
Mas algo me diz que deveria ser mais simples. o que estou perdendo?
ruby-on-rails
Brian Armstrong
fonte
fonte
Respostas:
Você pode especificar a ordem de classificação da coleção básica com uma opção
has_many
própria:Ou, se você quiser um método de classificação simples, sem banco de dados, use sort_by :
Coletar isso com os métodos de pedido adicionados por ActiveRecord:
Sua milhagem pode variar: as características de desempenho das soluções acima mudarão radicalmente dependendo de como você está obtendo dados em primeiro lugar e de qual Ruby você está usando para executar seu aplicativo.
fonte
-> { order(created_at: :desc) }
vez disso, use um lambda . Consulte: stackoverflow.com/questions/18284606/…A partir do Rails 4, você faria:
Para um
has_many :through
relacionamento, a ordem do argumento é importante (deve ser a segunda):Se você sempre vai querer comentários de acesso na mesma ordem não importa o contexto, você também pode fazer isso através de
default_scope
dentroComment
como:No entanto, isso pode ser problemático pelas razões discutidas nesta pergunta .
Antes do Rails 4, você podia especificar
order
como uma chave no relacionamento, como:Como Jim mencionou, você também pode usar
sort_by
depois de obter os resultados, embora em qualquer conjunto de resultados de tamanho isso seja significativamente mais lento (e use muito mais memória) do que fazer o pedido por meio de SQL / ActiveRecord.Se você estiver fazendo algo em que adicionar uma ordem padrão seja complicado por algum motivo ou se quiser substituir seu padrão em certos casos, é trivial especificá-lo na própria ação de busca:
fonte
.order()
à cadeia de métodos, como no último exemplo. É isso que você está perguntando?Se você está usando Rails 2.3 e deseja usar a mesma ordem padrão para todas as coleções deste objeto, você pode usar default_scope para ordenar sua coleção.
Então se você ligar
Eles serão ordenados de acordo com seu default_scope. Em um sentido muito geral, a ordenação TBH é o único uso realmente bom dos escopos padrão.
fonte
Você pode usar o método find do ActiveRecord para obter seus objetos e também classificá-los.
http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html
fonte
E se você precisar passar alguns argumentos adicionais como
dependent: :destroy
ou qualquer outro, você deve anexar aqueles após um lambda, como este:fonte