Можете ли вы сделать: заказ в рубине после поиска? - PullRequest
3 голосов
/ 23 июня 2009

Можно ли в ruby ​​/ rails заказать набор результатов после выполнения поиска? Например, возможно ли сделать что-то подобное

Предупреждение: не работает

if type == 1
  @items = mycompany.items
else
  @items = myhome.items
end

@items = @items :order => "created_at"

Я бы предположил, что подобное возможно, но я все еще плохо знаком с RoR и, похоже, ничего не могу найти в Google.

Ответы [ 3 ]

6 голосов
/ 23 июня 2009

Вы должны быть в состоянии сделать одно из следующих действий:

Сортировка при доступе:

if type == 1
  @items = mycompany.items(:order => 'created_at')
else
  @items = myhome.items(:order => 'created_at')
end

Сортировка после доступа:

@items.sort{|a,b| a.created_at <=> b.created_at}
5 голосов
/ 23 июня 2009

Вы также можете использовать сокращения от Symbol до Proc , доступные в рельсах, вместе с Enumerable#sort_by, чтобы упростить оператор сортировки, если вы хотите отсортировать после сбора ActiveRecord объекты:

@items.sort_by(&:created_at)
# is the same as @items.sort{ |a, b| a.created_at <=> b.created_at }
4 голосов
/ 23 июня 2009

Я не знаю, почему все "Нет, ты не можешь", когда это возможно в именованных областях.

Например, определите как часть ActiveRecord :: Base:

named_scope :by_created_at, :order_by => 'created_at'

Это позволяет вам преобразовать простое отношение в упорядоченное до его фактического извлечения:

@items = @items.by_created_at

Как примечание, не стоит включать области, которые имеют перекрытие: определения порядка, так как это приводит к их добавлению вместо того, чтобы переопределять каждую из них по очереди.

Тем не менее, в вашем примере это не слишком сложно, чтобы представить его рефакторинг следующим образом:

reference =
  case (type)
  when 1
     mycompany
  else
    myhome
  end

@items = reference.items.all(:order_by => 'created_at')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...