如何阻止友好id生成数字序列以区分冲突的slug?

时间:2016-02-15 08:42:13

标签: ruby-on-rails ruby-on-rails-4 rubygems friendly-id

假设我的has_many关联中的name有唯一性约束。这意味着我不需要将丑陋的数字序列添加到冲突的slu。中。

作为一个例子,2个slugs可能在game db中得到同一个名字来自2个不同的人,他们有一个叫做“卡片”的游戏。 /person/1/games/cardsperson/2/games/cards这些是2个不同的网址,但第二个网站上的slug看起来像person/2/game/cards2bc08962-b3dd-4f29-b2e6-244710c86106。人对他们的游戏名称有一个名称唯一性约束,所以他们不能有2个名为“卡片”的游戏。它会停止生成同一个slug中的2个。

问题是游戏的名称都在一个db中排序,因此冲突的slu will将在不需要时添加数字序列,因此url变得不必要地丑陋。

希望我理解为什么这么做。

反正。如何阻止数字序列被添加到冲突的slu ??中?

2 个答案:

答案 0 :(得分:4)

使用scoped functionality

class Card
   friendly_id :name, :use => :scoped, :scope => [:person]
end

答案 1 :(得分:2)

要添加到接受的答案,还有slug_candidates方法:

#app/models/card.rb
class Card < ActiveRecord::Base
  extend FriendlyId
  friendly_id :slug_candidates, use: :slugged

  def slug_candidates
    [
      :name,
      [:name, :person_id]
    ]
  end
end

以上将创建:

#url.com/players/1/games/cards
#url.com/players/2/games/cards-2

虽然不如scoped那么好,但它会为您提供其他实现的选项。