Это кажется действительно простым вопросом, но я нигде не видел ответа на него.
В рельсах, если у вас есть:
class Article < ActiveRecord::Base
has_many :comments
end
class Comments < ActiveRecord::Base
belongs_to :article
end
Почему нельзя упорядочить комментарии примерно так:
@article.comments(:order=>"created_at DESC")
Именованная область видимости работает, если вам нужно много ссылаться на нее, и даже люди делают такие вещи:
@article.comments.sort { |x,y| x.created_at <=> y.created_at }
Но что-то мне подсказывает, что должно быть проще. Что мне не хватает?
ruby-on-rails
Брайан Армстронг
источник
источник
Ответы:
Вы можете указать порядок сортировки для чистой коллекции с опцией для
has_many
себя:Или, если вам нужен простой метод сортировки, не связанный с базой данных, используйте sort_by :
Сбор этого с помощью методов заказа, добавленных ActiveRecord:
Ваш опыт может отличаться: характеристики производительности вышеупомянутых решений будут сильно меняться в зависимости от того, как вы в первую очередь получаете данные и какой Ruby вы используете для запуска своего приложения.
источник
-> { order(created_at: :desc) }
Вместо этого используйте лямбду . См .: stackoverflow.com/questions/18284606/…Начиная с Rails 4, вы должны:
Для
has_many :through
отношений имеет значение порядок аргументов (он должен быть вторым):Если вы всегда хотите , чтобы комментарии доступа в том же порядке , независимо от контекста , вы также можете сделать это через
default_scope
внутриComment
как:Однако это может быть проблематично по причинам, обсуждаемым в этом вопросе .
До Rails 4 вы могли указать
order
в качестве ключа отношения, например:Как упоминал Джим, вы также можете использовать результаты
sort_by
после получения результатов, хотя в наборах результатов любого размера это будет значительно медленнее (и будет использоваться намного больше памяти), чем при выполнении заказа через SQL / ActiveRecord.Если вы делаете что-то, где по какой-то причине добавление порядка по умолчанию является обременительным или вы хотите в некоторых случаях переопределить свой по умолчанию, указать его в самом действии выборки тривиально:
источник
.order()
в цепочку методов, как в последнем примере. Вы об этом спрашиваете?Если вы используете Rails 2.3 и хотите использовать один и тот же порядок по умолчанию для всех коллекций этого объекта, вы можете использовать default_scope для упорядочивания своей коллекции.
Тогда, если вы позвоните
Они будут упорядочены в соответствии с вашим default_scope. TBH в очень общем смысле - единственное действительно хорошее использование областей действия по умолчанию.
источник
Вы можете использовать метод find ActiveRecord, чтобы получать и сортировать объекты.
http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html
источник
И если вам нужно передать некоторые дополнительные аргументы, такие как
dependent: :destroy
или что-то еще, вы должны добавить их после лямбды, например:источник