2012-02-23 13 views
0

私は簡単な作業スケジュールのレールアプリを持っています。スケジュール内のジョブは、ジョブの優先度によって順序付けられます。いくつかのジョブは優先順位が変わる可能性があり、同じ性質で、それらを完了する必要があるので、2つのジョブが同じ優先順位を共有しないように、残りのテーブルの優先順位と優先順位を更新できる必要があります。優先度が更新されたら、優先度のリストが連続していること、つまり優先度が1,2,3,4,5などと表示されるようにします。 1,2,4,5,6,8などのようなギャップを持つ代わりに。Before_validation:継続性の更新とメンテナンス

これを達成するための適切なコーディングがわかりましたか?

これは、私は現在、私のモデルに持っているものです。

class Job < ActiveRecord::Base 
    include ActiveModel::Dirty 
    belongs_to :customer 
    has_many :job_items 

    before_validation :update_priorities 

    validates :priority, :uniqueness => true 

    private 

    def update_priorities 
    if self.priority_changed? 
    self.class.where("priority >= ?", self.priority).update_all("priority = priority + 1") 
    else 
    nil 
    end 
end 

上記のコードは、そのブランドの新しい仕事であれば優先順位は罰金が更新されます。しかし、いったん現在のジョブの順序を変更し始めると、ギャップがシーケンスに現れ始めます。

私は現在、自動的にこの種のものを行いますRailsの3.2.1

答えて

0

私はVeraticusが提供するacts_as_listを試しましたが、私のアプリケーションでは正しく動作しませんでした。それを手にした後、私は以下のコードに変更しました。それは私が必要とするように機能します。

def update_priorities 
if self.priority_changed? 
    if self.priority < self.priority_was 
    self.class.where("priority >= ?", self.priority).update_all("priority = priority + 1") 
    self.class.where("priority > ?", self.priority_was).update_all("priority = priority - 1") 
    else 
    nil 
    end 
    if self.priority > self.priority_was 
    self.class.where("priority <= ?", self.priority).update_all("priority = priority - 1") 
    self.class.where("priority < ?", self.priority_was).update_all("priority = priority + 1") 
    else 
    nil 
    end 
end 

エンド

1

あなたはおそらくここを探していることはacts_as_listですが、使用しています。たとえば、あなたが新しいジョブを作成していると、あなたはそれのために特定の位置をしたい場合:

@job = Job.create 
@job.insert_at(2) # will automatically insert your job at position 2, moving all other items in the list according. 

あなたを提供acts_as_listすべてのメソッド、check out the comments in the sourceを表示するには。

+0

それはあるかもしれません。コードとコメントのコードで使用する例を見ると、私はジョブをラップするためにマスタークラスが必要なようです。それが本当なら、それは私のために働かないだろう。 –

+0

私はあなたが範囲を提供しないことによってラッピングクラスなしでそれを使うことができると思います。したがって、モデル内で '' acts_as_list:column => 'priority''を呼び出すだけで、範囲を必要とせずにacts_as_listのすべての魔法を提供することができます。 – Veraticus

+0

私は間違っているかもしれませんが、マスタークラスが必要だと思います。マスタークラスを参照せずに残りのジョブを調整する方法はわかりません。 –

関連する問題