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-адрес, указывающий на ресурс, и другие параметры могли быть использованы для получения конкретных вещей.

Я думаю, что в конечном итоге настоящее решение для вас здесь здравый смысл!