Environnement: Rails 2.2.2, Oracle 10gComment renvoyer une date (pas un TimeWithZone) à partir d'une colonne de date Oracle dans ActiveRecord?
La plupart des colonnes déclarées "date" dans mes modèles ActiveRecord sont exactement celles-ci: dates: elles ne se soucient absolument pas de l'heure.
Donc, avec un modèle ainsi déclaré: #
class MyDateOnlyModel < ActiveRecord::Migration
def self.up
create_table :my_date_only_model do |t|
t.date :effective_date
t.timestamps
end
end
end
écrire un test comme celui-ci:
test_date = Date.new(2008,12,05)
MyDateOnlyModel.create!(:effective_date => test_date)
assert_equal test_date, MyDateOnlyModel.find(:first).effective_date
devrait passer, devrait-il pas? (En supposant que je n'ai rien gâché en transcrivant ce qui précède, bien sûr)
Mais ce n'est pas - pas tout à fait. Je reçois ceci:
<Fri, 05 Dec 2008> expected but was
<Fri, 05 Dec 2008 00:00:00 UTC +00:00>.
Je mis une date dans la base de données et nous avons obtenu ... bien ce que ne-je obtenir?
puts MyDateOnlyModel.find(:first).eff_date.class
me dit que j'ai effectivement obtenu un ActiveSupport::TimeWithZone
. Ce qui n'était pas ce que je voulais du tout.
Existe-t-il un moyen simple de dire à ActiveRecord que certaines colonnes (pas toutes) sont Date
s et seulement Date
s?
MISE À JOUR: plus se plaindre ...
Oui, je pourrais utiliser to_date:
assert_equal test_date, MyDateOnlyModel.find(:first).effective_date.to_date
fonctionne très bien. Mais c'est ce que j'essaie d'éviter. J'ai demandé à AR de me faire un rendez-vous, je veux un rendez-vous.
Et je pourrais ajouter une méthode à ma classe, effective_date_as_date - qui fonctionne aussi. Mais il n'est sûrement pas impossible d'avoir une date, dagnabbit.
PRÉRÉCEPTION MISE À JOUR
Finalement, je compris pourquoi cela était un problème particulier avec Oracle: il n'y a pas de distinction entre DATE et DATETIME, donc ActiveRecord ne peut pas comprendre sans aide si un temps de zéro signifie minuit (éventuellement avec des corrections de fuseau horaire) ou juste la date. Bah. Oracle stupide. Donc, je vais devoir soit descendre le chemin du plugin, changer ma base de données (tentant, donc très tentant) ou continuer avec le to_date/to_time mess que j'ai actuellement.
Ce n'est pas vraiment une réponse (et donc je fais juste un commentaire!), Mais je note que l'ORM de DataMapper supporte ce cas en exigeant que toutes les propriétés soient déclarées (avec les types) dans le modèle . –