Before_validation: обновление и поддержание непрерывности - PullRequest
0 голосов
/ 23 февраля 2012

У меня есть простой график работы приложения рельсов.Задания в расписании будут упорядочены по приоритету задания.Поскольку некоторые задания могут изменить приоритет и по той же природе, в порядке их завершения, я должен иметь возможность обновлять приоритет и приоритет остальной таблицы, чтобы гарантировать, что никакие 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

Ответы [ 2 ]

1 голос
/ 23 февраля 2012

Возможно, вы ищете здесь 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.

Чтобы увидеть все методы, которые предоставляет вам act_as_list, посмотрите комментарии в источнике .

0 голосов
/ 29 февраля 2012

Я попробовал 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

конец

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...