Rails:强制模型上的订单

时间:2012-06-22 14:55:10

标签: ruby-on-rails ruby-on-rails-3.1

为每个未结头寸构建一个具有多个阶段的招聘应用程序。用户创建一个位置,然后在该位置创建阶段。我希望能够强制执行订单,以便可以通过阶段处理申请人。

订单稍后可以编辑(通过拖放),但是现在我只需要它们默认订单。

到目前为止,这是我的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 个答案:

答案 0 :(得分: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

编辑:添加了一些说明和default_scope