Je n'ai jamais pu trouver une bonne façon de le faire, alors j'ai pensé que je vous demanderais.
Par exemple, dans un modèle Activerecord, les attributs sauvegardés de la base de données sont automatiquement convertis dans la base de données appropriée. types sauvegardés. Si j'ai un code> modèle code>, et il dispose de quelques attributs, disons rails sait que disons que j'ai Plusieurs attributs transitoires / synthétiques que je veux valider, et ils ont des types spécifiques. Je veux les soumettre d'un formulaire, et j'aimerais qu'ils soient automatiquement convertis en une chaîne ou un entier ou une date (par exemple) basé sur la manière dont ils sont définis. P> si je était de déclarer quelque chose dans un modèle de rails comme: p> existe une manière intégrée de raconter des rails "J'aimerais que vous lanciez le premier à un entier et à la ce dernier à une date, quand je vais nom code> et
catégorie_id code>, si je vais comme ça: p >
nom code> est une chaîne et
catégorie_id code> est un entier. P>
catégorie.new (parames [: catégorie]) code> "Tant que
parames [: catégorie] [: Certain_number_variable] code> et
et
[: Catégorie] [: Certain_date] code> Fait partie des données soumises au contrôleur (je réalise que l'exemple de date peut être un peu plus délicieux, étant donné les nombreux formats de date là-bas). P> P>
6 Réponses :
Cela vous donnera au moins l'auteur gratuitement. C'est la meilleure solution que je connaisse pour quoi (je pense) que vous décrivez. P> Edit: En ce qui concerne la validation, je pense que si vous utilisez des rails 3, ce sera beaucoup plus facile pour vous Pour effectuer une validation sur ce type d'attributs (je ne l'ai pas fait, je ne peux pas dire à coup sûr). Maintenant que les validations ne sont pas liées directement à Activerecord, je le croirais possible. P> p> attr_accesor code> crée simplement des méthodes de lecteur / écrivain, et vient de RUBY , pas rails. La méthode des rails que je crois souvent confuse est
attr_accesible code> qui sert Un but différent . Si vous souhaitez lancer lorsque l'attribut est lu, vous pouvez simplement remplacer le lecteur.
Yup, je suis conscient que Att_Accessor est une méthode rubis, et je sais qu'Att_Accessable est de spécifier quels attributs permettent la masse de masse. Je pense que vous avez raison à propos des rails 3 - Étant donné que les validations se produisent maintenant en dehors de Aciverecord, il serait probablement plus facile de le faire.
Je suppose par attribut "transitoire / synthétique" que vous voulez dire un attribut virtuel? p>
Si tel est le cas, il n'y a pas de fonction de rails intégrée qui fera cela que je peux penser à la permanence, mais une solution serait de simplement écrire un module pour ces attributs et l'inclure dans le modèle. Ou s'il devait être dynamique, vous pouvez appeler l'attribut quelque chose du genre: Quelque_variable_integer, puis gérez ces attributs dynamiques avec méthody_missing, lisez le nom de la méthode et le convertissez-le au type requis. P>
À mon avis, ce sont un peu désordonnés, alors les validations dans le modèle sont vraiment votre meilleure mise si ce que vous cherchez à faire peut les soutenir. P>
Ouais - je veux dire virtuel, je suppose qu'ils sont tous pareils pour moi. Je pourrais certainement gérer la conversion et même la validation par une forme de métaprogrammation, mais je voulais savoir s'il y avait des choses intégrées qui manquaient.
Aucune des réponses ne répond pas à la question. Je crois que la bonne réponse aux questions est simplement "non". Les réponses adressent les solutions de contournement potentielles au fait que la réponse à la question est «non», et les deux sont des commentaires / idées valides. p>
Utilisez avant_create ..
class Category attr_accessor :some_number_variable, :some_date before_create :validate private def validate return unless !!params[:category] #do variable casting here end end
Cela ne traite pas du tout à la question, ce qui est lié à la présentation automatique de rails tycédez l'attribut au type souhaité.
Ensuite, cochez cette réponse ... Stackoverflow.com/a/8940255/536984 ... Il s'adresse à l'écriture de son propre Attr_accesor .. Depuis Ruby Attr_Accessor, c'est juste pour définir des valeurs ... Son ne se soucie pas des types variables ...
Ajoutez les éléments suivants à votre modèle:
columns_hash["birth_date"] = ActiveRecord::ConnectionAdapters::Column.new("birth_date", nil, "date")
AS des rails 5, il y a le API d'attribut que vous Peut utiliser comme ceci: Vous pouvez définir les valeurs par défaut et définir vos propres types, entre autres choses agréables. Ensuite, vous pouvez valider ces attributs (virtuels ou non) tels que n'importe quel autre db soutenu. P> p>