1

募集中のポジションごとに多くのフェーズを持つ採用アプリを構築します。ユーザーがポジションを作成し、そのポジション内にフェーズを作成します。申請者がフェーズを介して処理できるように、フェーズを強制的に順序付けできるようにしたいと考えています。

注文は後で (ドラッグ アンド ドロップで) 編集できるようになりますが、今のところ、注文をデフォルトにする必要があります。

これまでのところ、一番下に set_sort_order がある私の phase.rb は次のとおりです。

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
4

1 に答える 1

1

acts_as_list宝石を使用してください:

# 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で直接より多くの作業を行うため、もう少し効率的だと思います。

さらに、値をシーケンシャルに保ちながら、リスト内でレコードを移動するための便利なメソッドを追加します(詳細については、acts_as_listのコードを参照してください)。sort_orderしたがって、位置に追加される最初のフェーズは、、sort_order = 12番目のフェーズは2、というようになります。そして、これらのメソッドを使用してフェーズを移動するとsort_order、ポジションの他のすべてのフェーズの更新が処理されるため、常に1、2、... nになります。

編集:いくつかの説明とdefault_scope行を追加しました

于 2012-06-23T20:31:44.187 に答える