使用复合键Rails RESTful路由

时间:2013-06-07 16:56:17

标签: ruby-on-rails rest routes

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

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

3 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:2)

您可以使用gem composite primary keys,请参阅homepage

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

这似乎是一个很好的appraoch,因为你仍然用它的identfier引用该对象,这是你的情况下几个属性的组合。

你也可以在没有gem的情况下使用这种技术,将to_param中的属性组合起来然后再分割以进行搜索。它保留了标准的RESTful路由。

答案 2 :(得分:0)

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

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

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

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

或类似的东西

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

其中value2是可选参数。

那就是说,其他一切都应该有效,因为它与其他一切都有效。唯一的区别是路线不仅仅是一个id。

更多

另外,我不得不说人们常常误会休息。 Rails大量使用CRUD请求,任何事情都可以非常安静。我们的想法是拥有一个代表您尝试访问的内容的网址。

检查出来:

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

如果需要,请不要担心使用get参数。主要思想是有一个指向资源的URL,其他参数可用于获取特定的东西。

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