PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

erreur multiparamètre avec datetime_select

Christian. Il s'agit d'un bogue dans Rails qui vérifie la base de données pour déduire le type nécessaire pour les attributs multiparamètres. Je suppose que votre attribut "date_time" n'est pas associé à une colonne d'heure dans votre base de données.

J'ai récemment abordé ce problème où je voulais un attribut non base de données pour accepter les attributs multiparamètres, c'était la meilleure solution que je pouvais trouver :

Je me suis retrouvé à vouloir définir un attr_accessor pour gérer le passage d'une date à mon modèle dans un form_for tag avec le f.datetime_select assistant. Voici donc ce que j'avais :

Modèle :

attr_accessor :my_time

Afficher :

<%= f.datetime_select :my_time %>

Malheureusement, lorsque je soumets mon formulaire, j'obtiens ceci :

1 error(s) on assignment of multiparameter attributes

Eh bien, il s'avère qu'il s'agit en fait d'un bogue Rails pour lequel un ticket a été soumis. En attendant, comment pouvons-nous faire en sorte que cela fonctionne ? La seule solution que j'ai pu trouver qui était à distance attrayante était d'utiliser composed_of en remplacement de attr_accessor . alors...

Modèle :

  composed_of :my_time,
              :class_name => 'Time',
              :mapping => %w(Time to_s),
              :constructor => Proc.new{ |item| item },
              :converter => Proc.new{ |item| item }

Je ne sais presque rien sur le composed_of donc vous devriez probablement faire votre propre lecture dessus, mais ce que je sais, c'est qu'elle crée à la fois un lecteur et un écrivain pour la variable d'instance donnée, et plus important encore, le setter accepte les attributs multiparamètres. Comment j'ai choisi les options :

class_name :le nom de notre classe attendue. Dans ce cas, Time
mappage :le premier argument est la classe et le deuxième argument semble fonctionner avec n'importe quelle méthode à laquelle une instance de la classe répond. J'ai choisi to_s constructeur :Je ne sais pas vraiment comment cela est censé fonctionner. Semble être appelé quand @my_time est nil .
converter :Je ne sais pas vraiment comment cela est censé fonctionner. Semble être appelé depuis my_time=, mais ne semble pas être appliqué avec une affectation de masse. Un problème que j'ai rencontré avec cette solution était que les heures étaient définies en UTC au lieu du fuseau horaire de l'environnement. Donc, malheureusement, nous ne pouvons pas utiliser my_time directement, mais devons plutôt le convertir dans le fuseau horaire approprié :

Time.zone.parse(my_time.to_s(:number))