Сортировать массив в контроллере - PullRequest
2 голосов
/ 17 июля 2010

Здравствуйте, я бы хотел отсортировать массив в контроллере Rails. Я хочу отсортировать массив перед циклом в представлении

@projects = Project.all.sort #throws error
#and
@projects = Project.all
@projects.sort               # throws error

выдает эту ошибку: неопределенный метод <=> для #<Project:0x101f70b28> но когда я спрашиваю:

@projects.respond_to?('sort')

Я получаю правду

Как мне отсортировать массив? Это должно быть сделано в представлении или в контроллере? Любая помощь высоко ценится!

Ответы [ 3 ]

15 голосов
/ 17 июля 2010

Руби не знает, как отсортировать ваш проект.Вы должны указать поле для использования для сортировки.Пример для created_at:

@projects = Project.all.sort { |p1, p2| p1.created_at <=> p2.created_at }

или

@projects = Project.all.sort_by &:created_at

Кроме того, вы можете отсортировать их на уровне базы данных:

@projects = Project.find(:all, :order => 'created_at')
4 голосов
/ 17 июля 2010

Когда вы пытаетесь отсортировать массив объектов, ruby ​​должен знать, как решить, какие объекты должны быть первыми.

Если ваши объекты имеют внутренний порядок, например, у них есть «число», которое нужно отсортировать, а затем внедрите метод в свой проект следующим образом:

def <=> other
  number <=> other.number
end

Метод <=> используется ruby ​​для сравнения двух объектов и определения того, который появляется первым.В этом примере мы просто делегируем сортировку атрибуту числа (строки и числа уже имеют встроенный порядок)

Альтернативой, если существует много способов сортировки ваших объектов, является указание во время сортировки.как сортировать.Как пояснил True Soft, есть несколько способов сделать это, мой любимый способ:

 @projects = Project.all.sort_by &:created_at

.. сортировать по полю созданного_

.
0 голосов
/ 17 июля 2010

Самый простой способ - переопределить <=> в Project:

def <=>(other_project)
  self.some_comparable_field <=> other_project.some_comparable_field
  # or otherwise return 1, 0 or -1 based on custom comparison rule
end

Тогда ваш оригинальный код будет работать.

См .: http://ruby -doc.org / core / classes / Comparable.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...