Ruby on rails rails中的自动增量复制字段

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方法中,但您不需要新列(除非您需要),

我将Rails4与postgresql一起使用。 我的模型有一个标题属性,它是唯一的。 但是,如果用户提交了一个重复的标题,我想增加一个。 假设标题是“Crepes”,如果另一个用户提交了“Crepes”,它将保存为“Crepes 1”、“Crepes 2”等等

我认为最好的办法是另设一个名为displayname的栏目,并保持原有标题的得体性。创建之前,请找到标题相同的,并适当插入正确的编号


有更好的方法吗

最简单的方法实际上是在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。不过,正则表达式也应该起作用。