5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
# File 'app/models/restaurants/rank.rb', line 5
def self.sort(from_restaurant, to_restaurant)
Restaurant.transaction do
from_restaurant = Restaurant.find from_restaurant.to_i
to_restaurant = Restaurant.find to_restaurant.to_i
new_rank = to_restaurant.rank
operator = from_restaurant.rank > to_restaurant.rank ? '<' : '>'
limit_operator = from_restaurant.rank > to_restaurant.rank ? '>=' : '<='
affected_restaurants = Restaurant.where("rank #{operator} ?", from_restaurant.rank).where("rank #{limit_operator} ?", to_restaurant.rank)
inc_or_dec = operator == '>' ? -1 : 1
affected_restaurants.lock.each do |restaurant|
restaurant.rank = restaurant.rank + inc_or_dec
restaurant.sneaky_save!
end
from_restaurant.rank = new_rank
from_restaurant.sneaky_save!
affected_restaurants = affected_restaurants.map do |restaurant|
{ id: restaurant.id, rank: restaurant.rank }
end
affected_restaurants.push(id: from_restaurant.id, rank: from_restaurant.rank)
affected_restaurants
end
end
|