Ruby on rails Rails:如果permalink已经使用,则将编号附加到permalink

Ruby on rails Rails:如果permalink已经使用,则将编号附加到permalink,ruby-on-rails,unique,slug,permalinks,validates-uniqueness-of,Ruby On Rails,Unique,Slug,Permalinks,Validates Uniqueness Of,如果已经有了John-Doe-1,我想给John-Doe永久链接John-Doe-2。 数字应该是下一个要附加的免费数字(“john doe-n”) 目前,我的永久链接是以通常的方式生成的: before_validation :generate_slug private def generate_slug self.permalink = self.name.parameterize end 如何实现一个验证类方法的唯一性,将此类数字添加到self.permalink,然后正常

如果已经有了John-Doe-1,我想给John-Doe永久链接John-Doe-2。 数字应该是下一个要附加的免费数字(“john doe-n”)

目前,我的永久链接是以通常的方式生成的:

before_validation :generate_slug  
private
def generate_slug   
  self.permalink = self.name.parameterize
end

如何实现一个验证类方法的唯一性,将此类数字添加到self.permalink,然后正常保存用户?

首先,问问自己:有没有更简单的方法?我相信有。如果你已经愿意在你的slug中添加数字,那么总是添加一个数字,比如ID,怎么样

before_validation :generate_slug

private
def generate_slug
  self.permalink = "#{self.id}-#{self.name.parameterize}"
end
这是一种非常健壮的方法,您甚至可以将slug直接传递给
find
方法,这意味着您根本不需要保存slug


否则,您只需检查名称+数字是否已经存在,并将n增加1,然后重新检查,直到找到一个可用数字。请注意,如果有许多同名记录,这可能需要一段时间。如果同时生成两个slug,这种方式也会受到竞争条件的影响。

多亏了dvyjones,在这个以用户为中心的虚荣案例中,可能很不幸的是,它的创建日期与配置文件permalink关联:user/4208 john-doe显然比user/1-john-doe更新。所以我会选择你的第二个解决方案,你会如何在代码中准确地处理这个问题?嗯,john-doe-1也会比john-doe-2更新。但为了回答你的问题,我相信这会奏效。我还没有测试过。你的要点是有效的,只是在where查询前加上了模型名(“User”),并添加了if self.name\u?对方法进行了修改。防止在保存时向同一用户添加新号码。不过这只是一个合理的警告:随着更多同名用户注册,这将变得更慢。