使用 FriendlyId 在 slug 中有一个重复的数字序列
Having a duplicate number sequence in slug using FriendlyId
我正在使用 gem 'friendly_id', '~> 5.0.0
,我只想使用旧行为,即在 slug 中附加一个数字序列计数,而不是 UUID
。
例如
>> test-slug-2
>> test-slug-3
>> test-slug-4
我能够使用:
config/initializers/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
时,它会生成一个 slug,它是 test-slug-4
这最终有一个错误,因为
鼻涕虫已经被拿走了。
一种选择是使用子字符串方法来查找最大数量。例如,在 PostgreSQL 中你可以这样做:
slug_start = "#{slug}#{separator}"
sequence = self.class.where("#{column} like '#{slug_start}%'").maximum("SUBSTR(#{column}, #{slug_start.length + 1})::Int") + 1
无论如何,我为此做了一个解决方法。
如果下次创建 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
我正在使用 gem 'friendly_id', '~> 5.0.0
,我只想使用旧行为,即在 slug 中附加一个数字序列计数,而不是 UUID
。
例如
>> test-slug-2
>> test-slug-3
>> test-slug-4
我能够使用: config/initializers/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
时,它会生成一个 slug,它是 test-slug-4
这最终有一个错误,因为
鼻涕虫已经被拿走了。
一种选择是使用子字符串方法来查找最大数量。例如,在 PostgreSQL 中你可以这样做:
slug_start = "#{slug}#{separator}"
sequence = self.class.where("#{column} like '#{slug_start}%'").maximum("SUBSTR(#{column}, #{slug_start.length + 1})::Int") + 1
无论如何,我为此做了一个解决方法。 如果下次创建 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