Rails:自动增加列,同时保留基数

时间:2015-07-28 17:57:51

标签: ruby-on-rails activerecord

我正在尝试使用与此类似的方案实现功能: Company有许多Items,每个Item都有一个名为company_item_number的列。

我正在寻找一种方法来增加company_item_number,因为新项目会添加到特定Company中,即使在删除项目后也会保留基数。

请注意,这与item_id不同,只要任何 Company添加了任何项目,它就会自动递增。

例如:

公司A

  • company_item_number:1
  • company_item_number:2
  • company_item_number:3(删除/删除)
  • company_item_number:4

公司B

  • company_item_number:1(删除/删除)
  • company_item_number:2

正如您所看到的,我还需要确保如果删除了上一个项目,则下一个item_number应该比之前删除的项目大+1,保留基数。

对于如何做到这一点的任何想法将不胜感激。

1 个答案:

答案 0 :(得分:0)

由于您要求即使删除记录也要保留基数,这很复杂。我个人建议永远实际上删除项目记录;相反,添加一个removed_at时间戳列,您可以检查该列以决定是否删除了某个项目。然后,您的方法变得更加简单(对于此任务,可能还有许多其他任务)。有了这个,您可以使用before_create挂钩,它在您的新记录保存到数据库之前运行,以填充每条记录上的字段,如下所示:

class Item < ActiveRecord::Base
   before_create do |item|
     current_highest = Item.where(company_id: item.company_id).pluck("MAX(company_item_number)").first
     item.company_item_number = (current_highest || 0) + 1
   end
end

如果你不想走那条路,你的companies.last_item_number_count想法似乎是一个不错的选择。或者,从中删除记录的新company_item_numbers表将起到类似的作用。最终,如果没有已删除项目的某些记录,则无法确保您不会重复使用已使用过的数字。