Есть ли более эффективный способ обновить порядок коллекции объектов в Rails 3? - PullRequest
1 голос
/ 09 октября 2010

Предположим, у меня есть коллекция страниц, упорядоченная по столбцу с именем: sibling_order. Есть ли более эффективный способ обновления порядка коллекции, чем то, что я делаю ниже:

class Page < ActiveRecord::Base

...

def update_order(order)
  if (order < self.sibling_order)
    siblings = Page.where("parent_id = ? AND sibling_order < ? AND sibling_order >= ?",new_parent_id,self.sibling_order,order)
    siblings.collect{|s|s.update_attribute(:sibling_order,s.sibling_order + 1)}      
  elsif (order > self.sibling_order)
    siblings = Page.where("parent_id = ? AND sibling_order > ? AND sibling_order <= ?",new_parent_id,self.sibling_order,order)
    siblings.collect{|s|s.update_attribute(:sibling_order,s.sibling_order - 1)}      
  end    
  self.update_attribute(:sibling_order, order) if self.sibling_order != order             
end

...

end

1 Ответ

1 голос
/ 09 октября 2010

Попробуйте это:

def update_order(order)
  k = (order < self.sibling_order) ? 1 : -1 
  sql = "parent_id = ? AND " + ( k == 1 ? 
          "sibling_order < ? AND sibling_order >= ?" :
          "sibling_order > ? AND sibling_order <= ?")
  sql = Page.send(:sanitize_sql_array, [sql, new_parent_id, sibling_order,order])
  Page.update_all("sibling_order = sibling_order + (#{k})", sql)
  self.update_attribute(:sibling_order, order) if self.sibling_order != order
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...