我的模型中有以下内容:
class Dispenser < ActiveRecord::Base
extend FriendlyId
friendly_id :slug_candidates, use: :slugged
def slug_candidates
[
:full_name,
[:full_name, :id]
]
end
end
这会产生像:
这样的slu ..=> 'bob-barker-bob-barker-15'
确实应该是bob-barker
或bob-barker-15
,而不是两者。
答案 0 :(得分:7)
FriendlyId作者在这里。如前所述,您需要FriendlyId 5,它不适用于4.0。
另请注意,您不能将id字段用作slug的一部分,因为slug是在创建记录之前生成的。
如果您愿意在slug中使用id字段,那么除了FriendlyId之外,还有更简单的解决方案,例如覆盖here所述的to_param
方法。
答案 1 :(得分:2)
您要描述的功能是版本5
请参阅:https://github.com/norman/friendly_id#what-changed-in-version-50
你所写的内容实际上只是返回一个符号数组,这些符号在被转换为字符串后通过参数化方法运行...
2.0.0p247 :002 > ['name',['name',15]].to_s.parameterize # this is what friendly_id does in the background
=> "name-name-15"
希望有所帮助
答案 2 :(得分:2)
[:full_name,:id] - 你只能在onUpdate上执行此操作(当:id已设置) 当您在数据库表中创建新记录时,这将无效!
为了你的目的,你应该使用像这样的
def slug_candidates
[
:name,
[:name, 2],
[:name, 3],
[:name, 4],
[:name, 5],
[:name, 6],
[:name, 7],
]
端
或者很快
def slug_candidates
[:name] + Array.new(6) {|index| [:name, index+2]}
end
在没有额外SQL查询的情况下解决此问题的简单方法
答案 3 :(得分:1)
在slug冲突中,FriendlyID
默认使用UUID
(例如2bc08962-b3dd-4f29-b2e6-244710c86106
之类的内容)并且不接受id
。所以这样的事情不会起作用:
def slug_candidates
[
:full_name,
[:full_name, :id]
]
end
但您可以在:full_name
之后提供自定义号码,而不是:id
。
我做了类似的事情:
def slug_candidates
[
:full_name,
[:full_name, "#{User.where(
first_name: first_name, last_name: last_name
).count + 1}"]
]
end
所以我会得到像john-doe
,john-doe-2
,john-doe-3
等等。