Ruby on rails rails中的自动增量复制字段
我将Rails4与postgresql一起使用。 我的模型有一个标题属性,它是唯一的。 但是,如果用户提交了一个重复的标题,我想增加一个。 假设标题是“Crepes”,如果另一个用户提交了“Crepes”,它将保存为“Crepes 1”、“Crepes 2”等等 我认为最好的办法是另设一个名为displayname的栏目,并保持原有标题的得体性。创建之前,请找到标题相同的,并适当插入正确的编号Ruby on rails rails中的自动增量复制字段,ruby-on-rails,ruby,post,duplicates,auto-increment,Ruby On Rails,Ruby,Post,Duplicates,Auto Increment,我将Rails4与postgresql一起使用。 我的模型有一个标题属性,它是唯一的。 但是,如果用户提交了一个重复的标题,我想增加一个。 假设标题是“Crepes”,如果另一个用户提交了“Crepes”,它将保存为“Crepes 1”、“Crepes 2”等等 我认为最好的办法是另设一个名为displayname的栏目,并保持原有标题的得体性。创建之前,请找到标题相同的,并适当插入正确的编号 有更好的方法吗 最简单的方法实际上是在before_create方法中,但您不需要新列(除非您需要),
有更好的方法吗 最简单的方法实际上是在before_create方法中,但您不需要新列(除非您需要),因为您可以执行以下操作:
before_create :check_for_uniq
#...
#...
#...
def check_for_uniq
matches = Object.find_by_name(/#{self.name}|#{self.name}_\d/).count
self.name = "#{self.name}_#{matches}"
end
当然,除非您试图拥有最终用户看不到的显示标题和隐藏标题,在这种情况下,您肯定需要另一列来显示隐藏数据。我认为最好的方法是在插入新标题时,将具有相同标题的对象数保存到另一列,但保存标题,当它被输入时:
@my_models_amount = MyModel.where(title: 'Crepes').count
@my_model = MyModel.new(title: 'Crepes', title_counter: @my_models_amount)
然后显示它:
def display_title
title_counter.zero? ? title : "#{title} #{title_counter}"
end
这就是我最终会选择的方法。但它不是按名称查找的,我必须包含一个正则表达式来解析它,而不包含“匹配项”。因为如果有“Crepes”和“Crepes 1”,您的查找方法将只查找“Crepes”。无论如何谢谢你@这是一个很好的观点。出于某种原因,我甚至没有考虑到这一点。在这种情况下,多列更适合xD。不过,正则表达式也应该起作用。