2012-06-22 7 views
1

Создание приложения для найма с множеством фаз для каждой открытой позиции. Пользователь создает позицию, а затем создает этапы в этой позиции. Я хочу иметь возможность заставить фазы в порядке, чтобы кандидаты могли обрабатываться через фазы.Рельсы: Принудительный заказ на модели

После этого заказ будет доступен для редактирования (через drag-and-drop), но на данный момент мне просто нужно, чтобы они по умолчанию были заказаны.

Вот мой phase.rb до сих пор с set_sort_order на дне:

class Phase < ActiveRecord::Base 

    before_create :set_sort_order 

    has_many :applicants 

    belongs_to :position 

    attr_accessible :name, :sort_order, :position_id 

    private 
    def set_sort_order 
    self.sort_order||=self.position.phases.order(:sort_order).last.sort_order + 1 
    end 
end 

ответ

1

Используйте acts_as_list gem:

# Gemfile 
gem 'acts_as_list' 

# phase.rb 
class Phase < ActiveRecord::Base 
    acts_as_list :scope => :position, :column => :sort_order 
    default_scope :order => 'sort_order' 
    belongs_to :position 
    # ... 
end 

выше в основном заботится о настройке sort_order как ваш код делает , Я считаю, что это немного более эффективно, поскольку он больше работает непосредственно в SQL.

Кроме того, он добавляет кучу удобных методов для перемещения записей в списке (look in acts_as_list's code for more), сохраняя при этом значения sort_order. Таким образом, первая фаза, добавленная в позицию, будет иметь sort_order = 1, вторая будет 2 и так далее. И если вы будете использовать эти методы для перемещения фаз вокруг, он позаботится об обновлении sort_order для всех остальных фаз позиции, так что это всегда 1, 2, ... n.

Edit: Добавлены некоторые объяснения и default_scope линии

+0

Flambino, каждая фаза в конечном итоге будет столбец в отсортированном порядке ... как канбан доски. И каждая колонка будет иметь карты, такие как доска канбана. Это лучший маршрут? –

+0

@RailsNewGuy Да, я должен подумать, что это сработает. Если это связано с пользовательской сортировкой записей любого типа, 'act_as_list' упрощает работу. Код выше (я только что обновил его с некоторым объяснением), просто позаботится о том, чтобы упорядочить фазы правильно, поэтому вам не нужно беспокоиться о 2-х записих, заканчивающихся тем же «sort_order» и тому подобным. Это достаточно полезно, так как это началось как часть Rails. – Flambino

Смежные вопросы