有人可以用这种方法帮助我吗?

时间:2016-06-30 13:11:07

标签: ruby-on-rails callback

def positioning
  tasks = Painting.all.order(:position)
  increment = false
  tasks.each do |t|
    if !increment && t.position == self.position
      increment = true
      t.position += 1
      t.save
    elsif increment
      t.position += 1
      t.save
    end
  end
end

这个方法适用于before_save回调,当我添加一个新绘画时可以正常工作,但是它做错了会增加其他对象的位置,以后当我想更新任何对象时这是一个问题

2 个答案:

答案 0 :(得分:1)

使用update_attribute

的版本1
paintings = Painting.where(:position >=self.position)
paintings.each do |painting|
  painting.update_attributes(:position, painting.position + 1)
end

使用哈希的版本2

paintings = Painting.where(:position >=self.position)
paintings.each do |painting|
  paintingHash = Hash.new
  paintingHash["position"]=painting.position+1
  painting.update(paintingHash)
end

描述适用于版本2

第1行 找到所有位置高于当前的画作

第2行 通过选定的绘画开始尝试

第3行 创建用于更新的新哈希

第4行 为散列中的变量赋值等于原始位置+1

第5行 执行更新

第6行结束迭代

答案 1 :(得分:0)

试试这个?

{{1}}

这使您可以有效地仅循环您想要增加的那些。既然你已经完成了第一行的所有任务,那么我的成本就不会太高了。

我也不完全确定你的职位是基于0还是基于1。我的代码基于0,但如果不是,你需要调整索引行。