有没有办法更新rails中的字段,如果存在相同的值以保持其唯一性的不同字段?

时间:2018-02-08 20:57:35

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

我正在研究用户的模型,在该模型中,用户将根据sort_order对其进行排序。 我想要实现的目标是 如果我们为新用户设置相同的sort_order或更新现有用户,则具有相同sort_order的所有用户都会递增。 例如 我们有3种用户类型及其sort_order,如下所示

黄金,sort_order为1

使用sort_order为2的钻石

Platinum,sort_order为3

将Gold更新为2会导致Diamond增加到3,Platinum增加到4。

有没有办法在Rails中执行此操作?

2 个答案:

答案 0 :(得分:0)

当然,您听说过after_save吗?

您可以定义每次保存对象时作为回调运行的方法。在这种情况下,您可能只希望在排序顺序发生变化时运行它。

下面是一些伪代码 - 这会检查具有相同after_save的其他模型并递增它们。请注意,这将级联 - class Foo after_save :update_sort_orders, if: :sort_order_changed? def update_sort_orders Foo.where(sort_order: sort_order).where.not(id: id).each do |foo| foo.update_attributes(sort_order: foo.sort_order + 1) end end end 也将在增加的模型上调用,因此最终应更新需要更新的所有内容。

{{1}}

答案 1 :(得分:0)

此问题现已解决。 我做的是我先检查是否存在具有相同sort_order的记录。

def check_for_duplicates(sort_order)
    foo_list = Foo.all.sort_by { |hash| hash[:sort_order].to_i }
    foo_list.each do |foo|
      if foo['sort_order'] == sort_order
        foo.update_attributes(sort_order: sort_order+ 1)
        sort_order = foo['sort_order']
      end
    end
  end

`

希望这有助于某人!!!!! :)