Обновление записи обновит все остальные записи в модели, глобальный порядок в рельсах 3.1 - PullRequest
0 голосов
/ 17 октября 2011

Я хотел бы обновить все записи в модели rails (3.1) при обновлении атрибута для одной записи.

Как и self.update_attribute (: global_order => 1), до или после сохранения a хотел бы обновить все остальные записи для обновления их global_order (1, 2, 3, 4).

Прямо сейчас с обратным вызовом after_save, я попал в рекурсивный цикл, пропустить обратные вызовы - это путь? Я хотел бы, чтобы приложение генерировало исключения, если что-то кажется странным в global_order.

Или есть 3,1 драгоценных камня, которые решат мою проблему.

after_save :set_global_order

def set_global_order
    @products = self.class.all(:order => :global_order)
    @products.sort! {|a,b| a.global_order <=> b.global_order}
    @products.reverse!
    @products.each_with_index do |p, index|
        p.update_attributes!({:global_order => index + 1})
    end
end

1 Ответ

0 голосов
/ 17 октября 2011

Не уверен, что есть драгоценный камень, но вы определенно можете изменить его с учетом следующих соображений:

  • Нет необходимости загрязнять объект переменной экземпляра, когда локальная будет делать
  • Первые три строки сортируют один и тот же набор, почему бы не сделать это один раз?

...

def set_global_order
  products = self.class.order('global_order DESC')

  products.each_with_index do |p, index|
    p.update_column(:global_order, index + 1)
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...