Quora-like重复的slu ..

时间:2014-07-11 21:34:27

标签: ruby-on-rails ruby url ruby-on-rails-4

我已经在SO上找到了这个问题的答案,但似乎找不到答案。

基本上我想做的就是Quora的Url Structure,如果个人资料名称为 Thomas Jefferson ,那么它就变成 quora.com/thomas-jefferson 。如果网站上已有托马斯·杰斐逊,那么它将变为 quora.com/thomas-jefferson-1 ,依此类推x个重复项。

FriendlyId gem有类似的东西,但不是增量,而是生成一个很难看的SecureRandom字符串。

到目前为止,我有一个Rails模型:

class Profile < ActiveRecord::Base
   before_create :generate_slug

   def generate_slug do
      self.slug = loop do
         slug = to_slug(self.name)
         break slug unless Profile.exists?(slug: slug)
      end
   end

  def to_slug(name)
     self.transliterate.downcase.gsub(/[^a-z0-9 ]/, ' ').strip.gsub(/[ ]+/, '-')
  end
end

1 个答案:

答案 0 :(得分:1)

我假设您在配置文件表中的名称列上有索引。

您可以向数据库发出查询以获取所有条目,例如当前生成的slug并获取最大值。如果数据库没有返回任何东西,则使用当前的slug,否则解析max slug的整数部分并将其增加为1以获得新的slug。

def generate_slug
  slug = to_slug(self.name)
  max_slug = Profile.where("slug like '#{slug}-%'").max.try(:slug)
  self.slug = max_slug.present? ? slug : compute(slug, max_slug)
end

def compute(slug, max_slug)
  max_count = max_slug.gsub("#{slug}-", "").to_i + 1
  "#{slug}-#{max_count}"
end

*未经测试的代码