Class: Restaurants::Rank

Inherits:
Object
  • Object
show all
Defined in:
app/models/restaurants/rank.rb

Class Method Summary collapse

Class Method Details

.sort(from_restaurant, to_restaurant) ⇒ Object



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