2012-02-23 5 views
0

У меня есть простой график работы rails. Работы в расписании будут упорядочены по приоритету задания. Поскольку некоторые задания могут изменяться в приоритетном порядке и по той же самой природе, порядок, который должен быть завершен, мне нужно обновить приоритет и приоритет остальной части таблицы, чтобы гарантировать, что 2 задания не имеют одинакового приоритета. После обновления приоритета я хочу, чтобы список приоритетов был непрерывным, другими словами, приоритеты обозначены как 1,2,3,4,5 и т. Д. вместо пробелов, таких как 1,2,4,5,6,8 и т. д.Прежде чем это подтвердить: обновление и поддержание непрерывности

Может ли кто-нибудь помочь мне разобраться в правильном кодировании, чтобы достичь этого?

Это то, что я в настоящее время в моей модели:

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

Я попробовал act_as_list, предоставленный Veraticus, но он просто не работал должным образом для моего приложения. После некоторого вовлечения в это я изменил свой код на следующий, и он работает так же, как мне это нужно.

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

Я думаю, вы можете использовать его без класса упаковки, не предоставляя область. Поэтому просто вызовите '' 'act_as_list: column => 'priority''' в модели и он должен предоставить все magic_act_as_list без необходимости в области. – Veraticus

+0

Я мог ошибаться, но я думаю, что это требует мастер-класса. Я не думаю, что он знает, как отрегулировать остальные задания, не обращаясь к мастер-классу. –

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