这可能听起来像是一个微不足道的问题,但对于面向消费者的应用来说这是非常重要的
将可怕的mongo id映射到友好ID的最简单方法和最具扩展性的方法是什么?
xx.com/posts/4d371056183b5e09b20001f9
要
xx.com/posts/a
M
答案 0 :(得分:27)
您可以在mongoid中创建一个复合键,以使用键宏替换默认ID:
class Person
include Mongoid::Document
field :first_name
field :last_name
key :first_name, :last_name
end
person = Person.new(:first_name => "Syd", :last_name => "Vicious")
person.id # returns "syd-vicious"
如果您不喜欢这种方式,请检查此gem:https://github.com/hakanensari/mongoid-slug
答案 1 :(得分:21)
在您的收藏中定义一个友好的唯一字段(如slug),将其编入索引,在模型上定义to_param
以返回它:
def to_param
slug
end
然后在你的发现者中,通过slug而不是ID来找到:
@post = Post.where(:slug => params[:id].to_s).first
这样可以让slu for作为有效的PK用于资源互动,而且它们更漂亮。
答案 2 :(得分:8)
不幸的是,密钥宏已从mongo中删除。对于自定义ID, 用户现在必须覆盖_id字段。
class Band
include Mongoid::Document
field :_id, type: String, default: ->{ name }
end
答案 3 :(得分:4)
这是我用来成功回答这个问题的一个伟大的宝石:Mongoid-Slug
https://github.com/digitalplaywright/mongoid-slug。
它提供了一个很好的界面,可以在多个模型中添加此功能。如果您愿意自己动手,至少可以查看一下这些想法。如果您要走这条路线,请查看Stringex gem,https://github.com/rsl/stringex和acts_as_url库。这将有助于你获得漂亮的破折号之间的网站。