Rails устанавливает все значения записи на ноль - PullRequest
0 голосов
/ 30 сентября 2010

Как я могу установить все записи на 0 в таблице?- ОБНОВЛЕНИЕ - Что я хочу сделать, это следующее.У меня есть таблица с именем Pages с указанием названной позиции.Когда я удаляю страницу из таблицы, я хочу, чтобы функция som переупорядочила позиции, чтобы не было никаких неиспользуемых позиций.

EX.Позиции 1, 2, 4, 8, 9, 12 становятся 1, 2, 3, 4, 5, 6

Ответы [ 5 ]

4 голосов
/ 30 сентября 2010

Чтобы ответить на ваш первый вопрос,

Pages.update_all(:position => 0)

Один из способов обновления массива позиций при удалении позиции - обратный вызов before_destroy. Это надежно, только если метод Rails destroy является единственным способом удаления записей!

def decrement_positions
  Pages.update_all('position = position - 1', ['position > ?', position])
end

before_destroy :decrement_positions

Один свободный способ задания условий гонки для одновременного задания всех позиций в смежных значениях заключается в переходе на SQL:

Pages.update_all('position = 1 + (select count(1) from pages p where p.position < pages.position)')
4 голосов
/ 30 сентября 2010
Pages.find(:all).sort_by(&:position).each_with_index do |page, index|
  page.position = index + 1
  page.save
end
0 голосов
/ 30 сентября 2010

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

after_destroy :fix_order
def fix_order
  Page.order('position asc').all.each_with_index do |page, index|
    page.update_attribute(:position, index + 1) unless page.position == index + 1
  end
end
0 голосов
/ 30 сентября 2010

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

0 голосов
/ 30 сентября 2010

Model.all.map { |m| m.field = 0 }.save!

Однако при этом будет создано столько запросов, сколько имеется записей, поэтому в случае, если у вас есть лоты или записи, я бы предложил использовать что-то вроде this .

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