Rails:如果已使用永久链接,则将数字附加到永久链接
Posted
技术标签:
【中文标题】Rails:如果已使用永久链接,则将数字附加到永久链接【英文标题】:Rails: Append number to permalink, if permalink already taken 【发布时间】:2011-10-02 07:16:21 【问题描述】:我想给 John Doe 永久链接 john-doe-2,如果已经有 john-doe-1。 该数字应该是下一个要附加的空闲数字 ("john-doe-n")
目前我的永久链接是按通常的方式生成的:
before_validation :generate_slug
private
def generate_slug
self.permalink = self.name.parameterize
end
如何实现类似validates_uniqueness_of的方法,将这种数字添加到self.permalink,然后正常保存用户?
【问题讨论】:
【参考方案1】:首先,问问自己:有没有更简单的方法来做到这一点?我相信有。如果您已经愿意为您的 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,在这个以用户为中心的虚荣案例中,如果有一个与其创建日期相关联的个人资料永久链接可能会很不幸:user/4208-john-doe 显然比 user/1-john-doe 更新网站。所以我会选择你的第二个解决方案,你将如何在代码中解决这个问题? 嗯,john-doe-1 也会比 john-doe-2 更新。但要回答你的问题,我相信这会起作用:gist.github.com/456d87a12bdd6aa30779。不过我还没有测试过。 您的要点是有效的,只需将模型名称(“用户”)添加到您的 where 查询中,并将 if self.name_changed? 添加到方法。防止保存时将新号码添加到同一用户。 只是一个公平的警告:随着更多同名用户注册,这将变得更慢。以上是关于Rails:如果已使用永久链接,则将数字附加到永久链接的主要内容,如果未能解决你的问题,请参考以下文章