带有复合键的 Rails RESTful 路由

Posted

技术标签:

【中文标题】带有复合键的 Rails RESTful 路由【英文标题】:Rails RESTful routes with a composite key 【发布时间】:2013-06-04 01:39:41 【问题描述】:

我有一个非典型的 Rails 应用程序,它需要一个由两个值的复合键索引的表。使用 RESTful 服务添加包含两个值的复合键的正确方法是什么?

如果可能,请指出参考资料。

【问题讨论】:

【参考方案1】:

我花了很多测试才想出一个几乎“优雅”的解决方案:

scope "/users/:key1/:key2" do
  resource :users, :path => "" do
    resources :posts
  end
end

它产生:

    users_posts GET    /users/:key1/:key2/posts(.:format)              posts#index
                POST   /users/:key1/:key2/posts(.:format)              posts#create
 new_users_post GET    /users/:key1/:key2/posts/new(.:format)          posts#new
edit_users_post GET    /users/:key1/:key2/posts/:id/edit(.:format)     posts#edit
     users_post GET    /users/:key1/:key2/posts/:id(.:format)          posts#show
                PUT    /users/:key1/:key2/posts/:id(.:format)          posts#update
                DELETE /users/:key1/:key2/posts/:id(.:format)          posts#destroy
          users POST   /users/:key1/:key2(.:format)                    users#create
      new_users GET    /users/:key1/:key2/new(.:format)                users#new
     edit_users GET    /users/:key1/:key2/edit(.:format)               users#edit
                GET    /users/:key1/:key2(.:format)                    users#show
                PUT    /users/:key1/:key2(.:format)                    users#update
                DELETE /users/:key1/:key2(.:format)                    users#destroy

【讨论】:

【参考方案2】:

您可以使用 gem composite primary keys,参见homepage。

它使用标准的 RESTful 路由,并将多个属性的值组合在一个 :id 参数中。

这似乎是一个很好的方法,因为您仍然使用它的标识符来引用该对象,在您的情况下这是几个属性的组合。

您也可以在不使用 gem 的情况下通过组合 to_param 中的属性来使用此技术,然后再次拆分以进行搜索。它保留了标准的 RESTful 路由。

【讨论】:

即使一个简短的答案也是恕我直言的答案,如果它回答了特定问题(参考的 RESTful 方式)。但我添加了一个解释。【参考方案3】:

嗯,这很难说,但使用这样的路线应该是公平和好的。

http://domain/object/:value1/:value2

如果用户可以查看这两个键,这是迄今为止最简单的方法。如果两个值都是获取对象所必需的,那么这是一个很好的方法。如果只需要一个值,您可以使用主 ID,例如

http://domain/object/:id?value2=...

或者类似的东西

http://domain/object/:value1/:value2

其中 value2 是可选参数。

也就是说,其他一切都应该像与其他一切一起使用一样工作。唯一的区别是路由将不仅仅是一个 id。

更多

另外,我不得不说人们经常误解休息。 Rails 大量使用 CRUD 请求,任何事情都可以很安静。这个想法是有一个 url 代表你试图访问的内容。

看看这个:

https://en.wikipedia.org/wiki/Representational_state_transfer

如果需要,不要害怕使用 get 参数。主要思想是有一个指向资源的 url 和其他参数可以用来获取特定的东西。

我认为最终解决你问题的真正方法是常识

【讨论】:

我给你赏金是因为我发现你的回答很有帮助并想奖励它,但是我没有接受它,因为它仍然不是这个问题的“答案”。谢谢!

以上是关于带有复合键的 Rails RESTful 路由的主要内容,如果未能解决你的问题,请参考以下文章

如何将自定义 RESTful 路由添加到 Rails 应用程序?

带有复合键的EntityFramework导航属性

带有响应方法调用的键的 Rails json

Rails 无法正确解码来自 jQuery 的 JSON(数组变成带有整数键的散列)

Rails:如何访问 RESTful 助手?

具有复合替换键的 PXSelector