我正在使用gem 'friendly_id', '~> 5.0.0
,我只想使用在slug中附加数字序列计数而不是UUID
的旧行为。
例如
>> test-slug-2
>> test-slug-3
>> test-slug-4
我能够使用: 的配置/初始化/ slugged.rb
module FriendlyId::Slugged
def resolve_friendly_id_conflict(candidates)
column = friendly_id_config.slug_column
separator = friendly_id_config.sequence_separator
slug = normalize_friendly_id(candidates.first)
sequence = self.class.where("#{column} like '#{slug}#{separator}%'").count + 2
"#{slug}#{separator}#{sequence}"
end
end
和我的模型
extend FriendlyId
friendly_id :name, use: [:slugged, :finders]
但是当我有一个test-slug-3
和test-slug-4
并尝试在下次创建记录时删除test-slug-3
时,它会生成一个test-slug-4
的slug,这是因为我的错误
Slug已被采取。
答案 0 :(得分:1)
一种选择是使用substring方法来查找最大数量。例如,在PostgreSQL中你可以做类似的事情:
slug_start = "#{slug}#{separator}"
sequence = self.class.where("#{column} like '#{slug_start}%'").maximum("SUBSTR(#{column}, #{slug_start.length + 1})::Int") + 1
答案 1 :(得分:0)
无论如何,我为此做了一个解决方法。 如果你下次创建一个slug时已经使用了slug,它将获得类似slug的最大id并添加+1并附加到你将创建的下一个slug。
这是我的代码:
def resolve_friendly_id_conflict(candidates)
column = friendly_id_config.slug_column
separator = friendly_id_config.sequence_separator
slug = normalize_friendly_id(candidates.first)
count = self.class.maximum("id") + 1 || 1
if self.class.where("#{column} like '#{slug}%'").count >= 1
"#{slug}#{separator}#{count}"
end
end