我正在尝试使用与此类似的方案实现功能:
Company
有许多Items
,每个Item
都有一个名为company_item_number
的列。
我正在寻找一种方法来增加company_item_number
,因为新项目会添加到特定Company
中,即使在删除项目后也会保留基数。
请注意,这与item_id
不同,只要任何 Company
添加了任何项目,它就会自动递增。
例如:
公司A
公司B
正如您所看到的,我还需要确保如果删除了上一个项目,则下一个item_number应该比之前删除的项目大+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
表将起到类似的作用。最终,如果没有已删除项目的某些记录,则无法确保您不会重复使用已使用过的数字。