我一直在寻找这个问题的答案,但似乎找不到答案。
基本上,我想做的是类似Quora的Url结构,如果一个概要文件名为Thomas ,那么它就变成如果站点上已经有一个Thomas,那么它就会变成quora.com/thomas-jefferson-1,,等等。
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发布于 2014-07-11 21:59:26
我假设您在概要表中的name列上有一个索引。
您可以向数据库发出查询,以获取所有条目,如当前生成的段塞,并获取最大值。如果数据库不返回任何内容,请使用当前段塞,否则,解析最大段塞的整数部分,并将其与1一起递增以获得一个新的段塞。
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*未经测试的代码
https://stackoverflow.com/questions/24706916
复制相似问题