Mongo ID导致可怕的URL

min*_*eow 33 mongodb mongoid

这可能听起来像一个微不足道的问题,但对于面向消费者的应用程序来说这是非常重要的

什么是最简单的方法和最可扩展的方式将可怕的mongo id映射到一个友好的id?

xx.com/posts/4d371056183b5e09b20001f9

xx.com/posts/a

中号

小智 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"
Run Code Online (Sandbox Code Playgroud)

如果您不喜欢这种方式,请检查此gem:https://github.com/hakanensari/mongoid-slug


Chr*_*ald 21

在您的集合上定义友好的唯一字段(如slug),将其编入索引,在模型上定义to_param以返回它:

def to_param
  slug
end
Run Code Online (Sandbox Code Playgroud)

然后在你的发现者中,通过slug而不是ID找到:

@post = Post.where(:slug => params[:id].to_s).first
Run Code Online (Sandbox Code Playgroud)

这将让你将slug视为资源互动目的的有效PK,并且它们更漂亮.

  • 为什么甚至不使用slug作为`_id`字段?如果它将是唯一的并且被索引,那么就没有必要同时拥有它们.`_id`不限于`ObjectId`类型. (4认同)
  • 我认为因为mongodb惯例是在_id领域有真正的目标.例如,mongoid使用字符串id一段时间http://www.mongodb.org/pages/viewpage.action?pageId=16646831并且它引起了问题 (4认同)
  • @eagor如果要搜索字段,则应该索引该字段.此时,它应该与搜索具有给定ID的文档大致相同. (2认同)

sty*_*iii 8

不幸的是,关键宏已从mongo中删除.对于自定义ID,用户现在必须覆盖_id字段.

class Band
  include Mongoid::Document
  field :_id, type: String, default: ->{ name }
end
Run Code Online (Sandbox Code Playgroud)