Как обновить существующие записи, если конфликт, Ruby on Rails - PullRequest
0 голосов
/ 14 февраля 2012

В моем коде у меня есть модель категории, которая имеет много подкатегорий, и подкатегория принадлежит категории.

Подкатегория имеет поле: position, чтобы отслеживать, какую позицию она должна выстроить в соответствии с категорией.Вот мой код модели для подкатегории.

class Subcategory < ActiveRecord::Base
  belongs_to :category
  has_many :products
  validates_uniqueness_of :position
  scope :position, order("position asc")
end

Как вы видите, он не допускает повторяющихся позиций.Когда он обнаруживает, что позиция подкатегории уже существует, я хочу, чтобы он попросил пользователя сказать что-то вроде: «Эта позиция уже занята, но она все еще может быть вставлена. Хотите продолжить?»Да |Нет.

Если да, то мне нужно добавить +1 ко всем текущим категориям подкатегорий: позиция (после позиции "подкатегория в вопросе". Так что если категория 1 имеет подкатегории 1, 2 и 3, когдакто-то пытается добавить новую подкатегорию с позицией 2, мне нужно сбросить текущие 2 и 3 на 3 и 4 и вставить новую подкатегорию в позицию 2.

Если нет, тогда я просто хочу, чтобы она вернулась кэкран редактирования.

Я не уверен, как именно это кодировать, я предполагаю, что проверка: конфликт позиций будет в контроллере подкатегорий, если сохранение не удастся.

Так что мой2 вопроса: где лучше всего поставить чек на этот код, и мне нужна помощь / идеи для написания кода.

Ответы [ 2 ]

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

Я предлагаю acts_as_list для управления позицией. Это обрабатывает все, о чем вы говорите, за исключением того, что вам нужно будет вручную проверять наличие коллизий, чтобы запросить у пользователя:

if Subcategory.exists?(:position => params[:position])  # or whatever
  # alert the user
end
0 голосов
/ 14 февраля 2012

Если отложить проверку уникальности, это будет переиндексировать позиции:

# build a new subcategory
subcategory = category.subcategories.build(:foo => :bar)

# some arbitrary, zero-based position desired by your user
position = 3

# insert the subcategory at the desired position
category.subcategories.insert(position, subcategory)

# use each with index to re-index all of your subcategories
category.subcategories.each_with_index do |sc, index|
   sc.position = index
end

Вместо проверки уникальности вы можете добавить обратный вызов before_validation для Category, который просто гарантирует, что у вас есть отсортированный непрерывный наборпозиции в подкатегориях.

...