2013-06-07 9 views
10

Mam nietypową aplikację Rails, która potrzebuje tabeli do zaindeksowania za pomocą złożonego klucza dwóch wartości. Który jest poprawny sposób za pomocą usługi RESTful, aby dodać klucz złożony z dwóch wartości?Szyny RESTful trasy z kluczem złożonym

Jeśli to możliwe, proszę wskazać odniesienia.

Odpowiedz

4

Zajęło mi dużo testów wymyślić prawie „eleganckie” rozwiązanie:

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

To produkuje:

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

można użyć klejnot composite primary keys, patrz homepage.

Używa standardowych tras RESTful i łączy w sobie wartość wielu atrybutów w jednym parametrze :id.

Wydaje się to być dobrą opcją, ponieważ nadal odwołujesz się do obiektu z jego identyfikatorem, który jest kombinacją kilku atrybutów w twoim przypadku.

Możesz również użyć tej techniki bez klejnotu, łącząc atrybuty w to_param i następnie rozdzielając je do wyszukiwania. Zachowuje standardowe RESTful trasy.

+0

nawet krótka odpowiedź jest IMHO odpowiedź, jeśli to odpowiada na konkretne pytanie (RESTful sposób z referencją). Ale dodałem wyjaśnienie. –

0

Trudno powiedzieć, ale korzystanie z takiej trasy powinno być uczciwe i wystarczająco dobre.

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

Jeśli użytkownik może przeglądać oba klucze, jest to zdecydowanie najłatwiejszy sposób na zrobienie tego. Jeśli obie wartości są konieczne do uzyskania obiektu, jest to dobry sposób na zrobienie tego. Jeśli potrzebna jest tylko jedna wartość, można mieć główny identyfikator takie jak

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

lub coś w tym

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

Gdzie value2 parametr jest opcjonalny.

To powiedziawszy, wszystko inne powinno zadziałać tak, jak działało ze wszystkim innym. Jedyna różnica polega na tym, że trasy będą miały więcej niż tylko identyfikator.

więcej

Muszę też powiedzieć, że ludzie często nie rozumieją odpoczynku. Railsy w dużym stopniu korzystają z żądania CRUD, a wszystko może być całkiem spokojne. Chodzi o to, aby adres URL reprezentował to, do czego chcesz uzyskać dostęp.

to sprawdzić:

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

Nie bój się za pomocą parametrów uzyskać, jeśli są one potrzebne. Główną ideą jest posiadanie adresu URL, który wskazuje na zasoby, a inne parametry mogą być użyte do uzyskania określonych rzeczy.

Sądzę, że ostatecznym rozwiązaniem dla was tutaj jest zdrowy rozsądek!

+0

Daję ci nagrodę, ponieważ uznałem twoją odpowiedź za pomocną i chciałem ją nagrodzić, jednak nie przyjąłem jej, ponieważ wciąż nie jest "odpowiedzią" na to pytanie. Dzięki! – fotanus