我在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
答案 0 :(得分:1)
尝试这样的事情:
Deal.find(5).steps.order(:step_rank).each_with_index do |step, index|
step.update_attributes step_rank: index
end