代码之家  ›  专栏  ›  技术社区  ›  Rob

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

  •  0
  • Rob  · 技术社区  · 9 年前

    假设我有一个唯一性约束 name 在它的任何关联中。这意味着我不需要在冲突的段塞中添加丑陋的数字序列。

    例如,两个鼻涕虫可能在 game 来自两个不同的人的db,他们正在玩一种叫做“纸牌”的游戏 /person/1/games/cards person/2/games/cards 这是两个不同的URL,但第二个上的slug看起来像 person/2/game/cards2bc08962-b3dd-4f29-b2e6-244710c86106 .person对他们的游戏名称有一个名称唯一性限制,因此他们不能有两个名为“卡牌”的游戏,这两个游戏会停止生成两个相同的slug。

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

    希望这能解释我为什么想要它。

    无论如何我如何才能阻止数字序列被添加到冲突的段塞中?

    2 回复  |  直到 9 年前
        1
  •  4
  •   j-dexx    9 年前

    使用 scoped functionality

    class Card
       friendly_id :name, :use => :scoped, :scope => [:person]
    end
    
        2
  •  2
  •   Richard Peck    9 年前

    为了补充已接受的答案,还有 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 对于您所需要的,它将为您提供一些其他实现的选项。