2009-11-30 2 views
0

Я добавить пользовательскую сортировку в модели ActiveRecord, определив метод, как это:По умолчанию Logical Сортировать по Resultset массива RubyOnRails

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 является частью include для активной загрузки, но я ничего не делаю с массивом объектов до представления (когда я делаю form.fields_for: my_class). Я действительно хочу, чтобы иметь возможность выполнять эквивалент default_scope, используя мой логический вид, но я не думаю, что это возможно. Прямо сейчас, мой единственный вариант, похоже, добавляет дополнительную строку в контроллер, чтобы сделать сортировку по этому результату, но это не похоже, что это правильно.

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

ответ

0

Лучшим способом для этого является настройка базы данных для сортировки 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 
0

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

class ParentModel < ActiveRecord::Base 
    has_many :my_class do 
    # Sort the result set... 
    end 
end 
+0

Этот метод будет намного проще и DRY чем сортировка в контроллере. Но у него одинаковые проблемы сортировки в контроллере. А именно, время вычисления/использование памяти на больших наборах и сложности w.r.t. ограничение количества выбранных строк. И снова это вряд ли будет проблемой в определенных отношениях. – EmFi

+0

Я попробовал несколько вариантов этого, что, учитывая обстоятельства конкретной ситуации, больше того, что я искал. Но я не смог сделать скачок того, как выполнить блок по умолчанию. Я не работал с анонимным блоком ассоциации, достаточным для того, чтобы действительно понять - помимо очевидного - как они работают, я полагаю. Спасибо, однако, за предложение. – tmo256