Ruby - 为属性重新赋值

时间:2018-01-16 15:02:38

标签: ruby-on-rails ruby ruby-on-rails-4

我在Deal和Step之间有一个belongs_to / has_many关系:

class Deal < ActiveRecord::Base

 has_many   :steps,          dependent:  :destroy do   
    def length
      reject(&:marked_for_destruction?).length
    end
  end 

accepts_nested_attributes_for :steps, allow_destroy: true

end

Step属于Deal,并且有一个名为step_rank的属性。

我想找到一种方法来获取所有步骤并更改其step_ranks的值,以便:

  • 最低初始step_rank值的值为0

  • 其他人,同时在初始step_rank 方面保持相同的“顺序”,只需在最后以+1增量编制一系列

如果我们在最初给出Deal(例如id:5)时有以下步骤,请举个例子:

Deal(id=5).step(id:1).step_rank = 15
Deal(id=5).step(id:4).step_rank = 4
Deal(id=5).step(id:7).step_rank = 9
Deal(id=5).step(id:37).step_rank = 30

然后我需要找到一种方法将这些属性的值转换为:

Deal(id=5).step(id:1).step_rank = 2
Deal(id=5).step(id:4).step_rank = 0
Deal(id=5).step(id:7).step_rank = 1
Deal(id=5).step(id:37).step_rank = 3

如您所见,最终值构成一系列从0开始的值,并在保持初始顺序的同时逐一递增。

我找到了一种方法来重新排序但不是真的要改变它们的每个值。怎么做?

模型/ deal.rb

implement_increment( self.steps.reject(&:marked_for_destruction?).map{|u| u.step_rank} )

def implement_increment(array)
  sorted = array.sort
  lastNum = sorted[0]
  sorted[1, sorted.count].each do |n|
    lastNum = n
  end
  true
end 

1 个答案:

答案 0 :(得分:1)

尝试这样的事情:

Deal.find(5).steps.order(:step_rank).each_with_index do |step, index|
  step.update_attributes step_rank: index
end