Un travail autour qui pourrait aider:
d'abord créer une migration faisant:
rename_column :the_models, :time, :old_time
add_column :the_models, :time, :time
Alors maintenant, le modèle aura un champ appelé old_time
contenant les données de temps d'origine, et un nouveau champ time
avoir le bon type de champ. Par conséquent, les formulaires existants sembleraient comme perdu toutes les données de temps, mais au moins ils appellent the_model.time
pour obtenir le résultat.
Le vrai travail autour d'une partie:
class TheModel < ActiveRecord::Base
def time
read_attribute(:time) || Time.parse(read_attribute(:old_time))
end
end
Alors maintenant, la valeur temporelle sera enregistrée dans le time
déposé.
Lorsque time
est nul, il essaie d'obtenir la valeur de temps du old_time
et de le convertir en objet temporel.
Il y a deux inconvénients:
- Time.parse (« 12:34 ») vous donnerait quelque chose comme:
2010-12-14 12:34:00 +0800
Parce que vous avez donné que l'heure et minutes, d'autres champs ne sont pas fiables.
- Vous avez un champ presque obsolète appelé
old_time
dans la base de données. Donc, dans le futur, vous voudrez peut-être supprimer complètement ce champ, après avoir été sûr que toutes les valeurs old_time
ont été converties dans le champ time
.
Une note plus:
Vous devez convertir les formulaires existants, pour le champ :time
qui probablement en utilisant text_field. Le champ text_field peut devenir quelque chose comme 2010-12-14 12:34:00 +0800
.
Si vous voulez vraiment continuer à utiliser text_field, vous pouvez:
def time
t = read_attribute(:time)
t.nil? ? read_attribute(:old_time) : t.strftime("%H:%M")
end
def time=(val)
write_attribute(:time, Time.parse(val))
end
Vous pouvez modifier le type de champ, mais il faut plusieurs étapes. Que ça vaut la peine est la prochaine question. –
Oui ... Je ne veux pas vraiment changer le type de champ. Je cherche simplement un moyen de formater les données. – bgadoci
Si je devais changer le type de champ ... les données existantes pourraient-elles être mappées? – bgadoci