【问题标题】:scaling issues using friendly_id使用friendly_id 缩放问题
【发布时间】:2014-09-10 10:13:57
【问题描述】:

好的,所以我正在制作一个friendly_id,它可以让我有效地扩展它。这是我到目前为止所得到的。如果您有匹配的名称,它的作用基本上是在计数上添加 +1。因此,如果您是第二个注册为 John doe 的人,您的 url 将是 /john-doe-1。

extend FriendlyId
friendly_id :name_and_maybe_count, use: [:slugged, :history] 


def name_and_maybe_count
 number = User.where(name: name).count
 return name if number  == 0
 return  "#{name}-#{number}"
end

但是,这段代码仍然给我带来了一些问题。

  • 如果我创建了一个名为 John Doe 的用户。然后注册另一个名为 John Doe 的用户,slug 将是 /john-doe-UUID。如果我注册第三个用户,那么它将收到 slug john-doe-1。
  • 如果我有两个用户。一个先用名字注册的。说胡安·巴勃罗。然后他将自己的名字改成“Rodrigo”,然后又改回“Juan Pablo”。他的新名字将是“juan-pablo-1-UUID”。

我知道这对你们大多数人来说都是小问题,但这是我需要解决的问题!

【问题讨论】:

    标签: ruby-on-rails friendly-id


    【解决方案1】:

    你想覆盖to_param,包含id作为友好id的第一位

    我在我的一个应用中扩展了这样的活动记录,

    module ActiveRecord
      class Base
        def self.uses_slug(attrib = :name)
          define_method(:to_param) do
            "#{self.id}-#{self.send(attrib).parameterize}"
          end
        end
    end
    

    这样我就可以了

    uses_slug :name
    

    在任何型号中 但这在任何模型中都应该起作用:

    def to_param
      "#{self.id}-#{self.my_attrib.parameterize}"
    end
    

    这样做的好处是当你在控制器中你这样做时

    Model.find(params[:id]) 
    

    您无需更改任何内容,因为当 rails 尝试转换类似 "11-my-cool-friendly-id" 之类的字符串时,它只会获取第一个数字位并保留其余部分.

    【讨论】:

      猜你喜欢
      • 2017-02-08
      • 1970-01-01
      • 2019-05-24
      • 2013-02-12
      • 1970-01-01
      • 2018-06-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多