我已经在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
答案 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
*未经测试的代码