map.resources avec la clé primaire de remplacement (s)
-
01-10-2019 - |
Question
J'ai un modèle Rails Object
qui ne dispose pas d'une colonne d'identité. Il utilise plutôt un tuple de clés primaires de deux autres modèles comme la clé primaire, dependency_id
et user_id
.
Ce que je veux faire est d'être en mesure de faire quelque chose comme ça dans routes.rb
:
map.resources :object, :primary_key => [:dependency_id, :user_id]
Et pour de générer par magie URL comme ceci:
/objects/:dependency_id/:user_id
/objects/:dependency_id/:user_id/1
/objects/:dependency_id/:user_id/1/edit
... Sauf que je viens de faire ça, et il n'y a pas de syntaxe.
Y at-il un moyen de personnaliser map.resources
afin que je puisse obtenir les URL RESTful, sans avoir à faire des itinéraires personnalisés pour tout? Ou suis-je juste foiré pour ne pas suivre la convention d'identité?
L'option :path_prefix
ressemble quelque peu prometteuse, mais je voudrais encore besoin d'un moyen de supprimer la partie id
de l'URL. Et je voudrais être encore en mesure d'utiliser les aides de chemin si possible.
La solution
Vous devriez remplacer la méthode de modèle Object
de to_param
pour refléter votre clé primaire. Quelque chose comme ceci:
def to_param
[dependency_id, user_id].join('-')
end
Ensuite, lorsque vous installerez urls pour ces objets (comme object_path(some_object)
), il est automatiquement converti en quelque chose comme /objects/5-3
. Puis, en action show que vous auriez à diviser le tableau de bord et sur params[:id]
de trouver l'objet par dependency_id et user_id:
def show
dep_id, u_id = params[:id].split('-').collect(&:to_i)
object = Object.find_by_dependency_id_and_user_id(dep_id, u_id)
end
Vous pouvez également consulter find_by_param
bijou pour rails .