Mongo ids 导致可怕的 URL
Posted
技术标签:
【中文标题】Mongo ids 导致可怕的 URL【英文标题】:Mongo ids leads to scary URLs 【发布时间】:2011-06-12 06:44:42 【问题描述】:这听起来像是一个微不足道的问题,但对于面向消费者的应用来说却相当重要
将可怕的 mongo id 映射到友好的 id 上的最简单和最具扩展性的方法是什么?
xx.com/posts/4d371056183b5e09b20001f9
到
xx.com/posts/a
M
【问题讨论】:
您可以参考 Google Group 的这篇帖子:groups.google.com/group/mongoid/browse_thread/thread/… 虽然它实际上并没有回答您的问题,但它为您提供了一些解决问题的方法。 【参考方案1】:您可以在 mongoid 中创建一个复合键来使用 key 宏替换默认 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 还不够,谢谢! (关键的东西)【参考方案2】:在您的集合上定义一个友好的唯一字段(如 slug),在您的模型上对其进行索引,定义 to_param
以返回它:
def to_param
slug
end
然后在您的查找器中,按 slug 而不是 ID 查找:
@post = Post.where(:slug => params[:id].to_s).first
这将使您将 slug 视为资源交互的有效 PK,并且它们更漂亮。
【讨论】:
为什么不在_id
字段中使用slug?如果它将是唯一的并被索引,则无需同时拥有两者。 _id
不限于 ObjectId
类型。
我认为是因为 mongodb 约定是在 _id 字段中有真正的 objectids。例如,mongoid 使用了一段时间的字符串 ID mongodb.org/pages/viewpage.action?pageId=16646831 并导致了问题
效率怎么样?搜索长字符串 slug 不会比按 id 搜索花费更长的时间吗?
@eagor 如果你在一个字段上搜索,你应该索引那个字段。到那时,它应该大约与搜索具有给定 ID 的文档一样昂贵。【参考方案3】:
很遗憾,key 宏已从 mongo 中删除。对于自定义 ID, 用户现在必须覆盖 _id 字段。
class Band
include Mongoid::Document
field :_id, type: String, default: -> name
end
【讨论】:
这有很多陷阱。如果在实例化对象(Band.new)时没有设置name
,你最终会得到一个零_id
。之后设置_id
不起作用。【参考方案4】:
这是我用来成功解决这个问题的一个很棒的宝石:Mongoid-Slug
https://github.com/digitalplaywright/mongoid-slug。
它为跨多个模型添加此功能提供了一个很好的界面。如果您想自己动手,至少可以查看他们的实现以获取一些想法。如果您要走这条路,请查看 Stringex gem、https://github.com/rsl/stringex 和里面的acts_as_url 库。这将帮助您获得漂亮的 dash-between-url slugs。
【讨论】:
mongoid-slug 的 url 导致 404 消息。 @JoseCarrillo 谢谢,已修复!以上是关于Mongo ids 导致可怕的 URL的主要内容,如果未能解决你的问题,请参考以下文章