Логическая сортировка по умолчанию для массива Resultset RubyonRails - PullRequest
0 голосов
/ 30 ноября 2009

Я добавил пользовательскую сортировку в модель ActiveRecord, определив метод, подобный следующему:

class MyClass < ActiveRecord::Base
  belongs_to :parent_model #this would be the many in a has_many relationship

  def <=>(other)
    self.att <=> other.att
  end
end

Достаточно сказать, что логика, фактически используемая в сравнении, немного сложнее, чем этот пример, и не может быть реализована с помощью SQL.

Поскольку этот класс используется только как вложенные поля в охватывающей модели, кажется, нет простого места для сортировки набора результатов. В контроллере: my_class является частью включения для быстрой загрузки, но я ничего не делаю с массивом объектов до представления (когда я выполняю form.fields_for: my_class). Что я действительно хочу, так это иметь возможность сделать эквивалент default_scope, используя мою логическую сортировку, но я не думаю, что это возможно. Прямо сейчас, моя единственная возможность, кажется, добавить дополнительную строку в контроллере, просто чтобы выполнить сортировку по этому результату, но это не похоже на то, что это правильно.

Есть ли здесь что-то более элегантное, что мне не хватает?

Ответы [ 2 ]

0 голосов
/ 30 ноября 2009

Я не смог проверить, сработает ли это, но вы можете попробовать модуль анонимной ассоциации, например:

class ParentModel < ActiveRecord::Base
  has_many :my_class do
    # Sort the result set...  
  end
end
0 голосов
/ 30 ноября 2009

Лучший способ сделать это - настроить базу данных для сортировки SQL и задать параметр: order в ваших областях видимости / находках. Выполнение сортировки в контроллере будет очень дорогостоящим, когда количество загруженных объектов превысит определенный порог. Особенно, если вы пытаетесь ограничить количество записей в списке.

Если сортировка действительно сложнее, чем сортировать этот столбец, чем этот. Рекомендуется добавить в базу данных столбец ключ сортировки . Вы четко разработали какой-то метод упорядочения вещей, обычно включающий сравнение двух значений, полученных из состояния объекта. Просто сохраните это значение в базе данных в новом столбце sort_key с обратным вызовом before_create / save и упорядочите результаты по нему.

Пример задачи:

Упорядочено по приоритету, но записи, в которых срок оплаты - пятница, отображаются перед всеми остальными. Использует столбец sort_key

class Task < ActiveRecord::Base
  def calculate_sort_key
    key = due_date.wday == 5 ? "0" : "1"
    key += prioirty.to_s
    self.sort_key = key.to_i
  end

  before_save :calculate_sort_key
  default_scope :order => "sort_key"
end
...