Rails RESTful маршруты с составным ключом
У меня есть нетипичное приложение 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
вы можете использовать драгоценный камень composite primary keys
, см. homepage.
Он использует стандартные маршруты RESTful и объединяет значение нескольких атрибутов в одном параметре :id
.
Это, по-видимому, хорошая оценка, поскольку вы все еще ссылаетесь на объект с его идентификатором, который представляет собой комбинацию нескольких атрибутов в вашем случае.
Вы также можете использовать эту технику без драгоценного камня, объединив атрибуты в to_param
и снова разделите для поиска. Он поддерживает стандартные маршруты RESTful.
Ответ 3
Сложно сказать, но использование такого маршрута должно быть справедливым и достаточно хорошим.
http://domain/object/:value1/:value2
Если обе клавиши могут быть просмотрены пользователем, это, безусловно, самый простой способ сделать это. Если оба значения необходимы для получения объекта, тогда это хороший способ сделать это. Если требуется только одно значение, вы можете иметь основной идентификатор, например
http://domain/object/:id?value2=...
Или что-то вроде этого
http://domain/object/:value1/:value2
Где значение2 является необязательным параметром.
Тем не менее, все остальное должно работать, поскольку оно работает со всем остальным. Единственное различие заключается в том, что маршруты будут иметь больше, чем просто идентификатор.
более
Кроме того, я должен сказать, что люди часто неправильно понимают покой. Rails сильно использует запрос CRUD, и все может быть довольно спокойным. Идея состоит в том, чтобы иметь URL-адрес, который представляет то, к чему вы пытаетесь получить доступ.
Проверьте это:
https://en.wikipedia.org/wiki/Representational_state_transfer
Не бойтесь использовать параметры получения, если они необходимы. Основная идея заключается в том, чтобы URL-адрес, указывающий на ресурс, и другие параметры могли быть использованы для получения конкретных вещей.
Я думаю, что в конечном итоге настоящее решение для вас здесь здравый смысл!