Clés composites avec ActiveScaffold en Ruby On Rails
-
03-07-2019 - |
Question
Je développe une application RoR qui fonctionne avec une base de données existante et utilise le plug-in ActiveScaffold pour une interface CRUD élégante.
Cependant, l'une des tables de ma base de données existante possède une clé primaire composite. J'ai essayé d'utiliser le plug-in Composite Keys pour le gérer, mais il semble y avoir des conflits avec ACtiveScaffold: le message d'erreur suivant s'affiche:
ActionView::TemplateError (Could not find column contact,type) on line #3 of ven
dor/plugins/active_scaffold/frontends/default/views/_form.rhtml:
1: <ol class="form" <%= 'style="display: none;"' if columns.collapsed -%>>
2: <% columns.each :for => @record do |column| -%>
3: <% if is_subsection? column -%>
4: <li class="sub-section">
5: <h5><%= column.label %> (<%= link_to_visibility_toggle(:default_visible =
> !column.collapsed) -%>)</h5>
6: <%= render :partial => 'form', :locals => { :columns => column } %>
vendor/plugins/active_scaffold/lib/data_structures/sorting.rb:16:in `add'
tout en ayant dans le code du modèle smth comme:
set_primary_keys :contact, :type
J'apprécie énormément toute idée de la possibilité d'obtenir des clés composites avec ActiveScaffold.
La solution
Je pense que votre meilleur choix est peut-être de vérifier le le groupe Google ActiveScaffold , qui est surveillé par le noyau. Les développeurs d’ActiveScaffold pourront ainsi résoudre votre problème et expliquer pourquoi les clés composites associées au plug-in ne fonctionnent pas avec ActiveScaffold.
Je vous souhaite bonne chance et veillez à poster un suivi si vous obtenez des résultats du groupe Google (sur lesquels j'ai déjà posté et que j'ai reçu très rapidement des commentaires).
Un résultat rapide que j'ai trouvé est this .
Ce que j'ai fait était de créer une classe de façade qui n'hérite pas de
ActiveRecord crée ensuite le & id; id " affiche la clé primaire. Dans mon cas le
la clé primaire a été calculée à partir d'autres données et pourrait donc être modifiée
d'une édition, j'ai donc dû remplacer ActiveScaffold à quelques endroits pour
autoriser le changement de clé primaire après une mise à jour. Mais dans l'ensemble
cela fonctionne et est assez simple. Commencez avec une classe vide
et juste résoudre les messages qui ne sont pas compris. Dans votre cas, vous
pourrait même simplement rediriger tous les messages vers un ActiveRecord encapsulé tout en
remplacer les méthodes id et id = et filtrer les méthodes [] et [] =.
Cela peut faire l'affaire pour vous.
Autres conseils
Non, je n'ai reçu aucune réponse du groupe et je ne suis pas sûr qu'ActiveScaffold soit encore activement maintenu.
Après avoir joué avec ActiveScaffold pendant un certain temps, j'ai fini par implémenter ma propre interface CRUD à partir de rien.
Je travaille avec des modèles en lecture seule et j'utilise ActiveScaffold sur une base de données héritée.
L'astuce consistait à remplacer le champ "id" par défaut dans le modèle et à renvoyer une chaîne PK concaténée.
Si cela vous suffit, alors voilà:
class CPKReadonlyModel < ActiveRecord::Base
set_primary_key :id_one # only half of it, but id overridden below...
def id
self.id_one.to_s + ',' + self.id_two.to_s
end
def readonly?
true
end
def before_destroy
raise ActiveRecord::ReadOnlyRecord
end
def delete
raise ActiveRecord::ReadOnlyRecord
end
def self.delete_all
raise ActiveRecord::ReadOnlyRecord
end
end
Dans le bloc de configuration actif_scaffold, le contrôleur dispose des éléments suivants:
config.actions.exclude :create, :update, :delete