【问题标题】:Rails: Append number to permalink, if permalink already takenRails:如果已使用永久链接,则将数字附加到永久链接
【发布时间】: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,然后正常保存用户?

【问题讨论】:

    标签: ruby-on-rails unique slug permalinks validates-uniqueness-of


    【解决方案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? 添加到方法。防止保存时将新号码添加到同一用户。
    • 只是一个公平的警告:随着更多同名用户注册,这将变得更慢。
    猜你喜欢
    • 2012-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-30
    • 2017-03-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多