Я работаю над пользовательской моделью, в которой пользователи будут сортироваться на основе sort_order для них. Я пытаюсь добиться того, что если мы установим такой же sort_order для нового пользователя или обновим существующего пользователя, все пользователи с одинаковым sort_order будут увеличиваться. Например, у нас есть 3 типа пользователей с их sort_order следующим образом
Золото с sort_order как 1
Алмаз с sort_order как 2
Платина с sort_order как 3
Обновление золота до 2 должно привести к увеличению алмаза до 3, а платина - до 4.
Есть ли способ сделать это в Rails?
Эта проблема решена сейчас. Что я сделал, так это то, что я проверил сначала, если присутствует запись с таким же sort_order.
def check_for_duplicates(sort_order)
foo_list = Foo.all.sort_by { |hash| hash[:sort_order].to_i }
foo_list.each do |foo|
if foo['sort_order'] == sort_order
foo.update_attributes(sort_order: sort_order+ 1)
sort_order = foo['sort_order']
end
end
end
'
Надеюсь, это поможет кому-то !!!!! :)
Конечно, вы слышали о after_save?
Вы можете определить метод для запуска в качестве обратного вызова каждый раз, когда объект сохраняется. В этом случае вы, вероятно, только хотите, чтобы он выполнялся, если порядок сортировки изменился.
Ниже приведен псевдокод - это проверяет наличие других моделей с тем же sort_order
и увеличивает их. Обратите внимание, что это будет каскадно - after_save
также будет вызываться на моделях, которые увеличиваются, и поэтому в итоге будет обновлено все, что необходимо обновить.
class Foo
after_save :update_sort_orders, if: :sort_order_changed?
def update_sort_orders
Foo.where(sort_order: sort_order).where.not(id: id).each do |foo|
foo.update_attributes(sort_order: foo.sort_order + 1)
end
end
end
update foo set sort_order = sort_order + 1 where sort_order >= 1
или что-то в этом роде. Не уверен, как выразить это в Activerecord Lingo.