つくづく謎のdatetime。
相変わらずどーにも動いてくれない部分です。
datetime型にした変数…
class CreateOrders < ActiveRecord::Migration def self.up create_table :orders do |t| t.string :name, :null => false t.string :belong, :null => false t.text :comment, :null => false t.datetime :checked_at, :null => true t.date :order_date, :null => false # t.timestamps end end def self.down drop_table :orders end end
ですね。checked_atがdatetime型になっている訳です。
実際にこれを用いて色々やろうとするとエラーが出る訳です。
class Order < ActiveRecord::Base has_many :line_items BELONG_TYPES = [ ["外来", "外来"], ["病棟", "病棟"], ["放射線", "放射線"], ].freeze validates_presence_of :name, :belong, :message => "が空の状態で送信する事はできません。" #未確認の全ての物品を返す def self.pending_checking find(:all, :conditions => "checked_at is null") end #checked_at列は、未確認の場合に+NULL+ #それ以外の場合に確認日時が保存される。 def mark_checked self.checked_at = Time.now end end
mark_checkedメソッドにて、cheched_atの値(時間)を現在時刻(ここではチェックを入れた時間)に変更したいんですが、そーすると以下のようなエラーがボーン。
ActiveRecord::StatementInvalid in CheckController#check
ActiveRecord::ActiveRecordError: ????????????????????????: UPDATE orders SET checked_at = '--- 2008-10-03 15:19:03.165415 Z
' WHERE id = 2
やっぱりdatetime関連の項目を消せば解決という訳にはいかないようです。
だってこれが動かないと出来ないことがたくさん有るもの…
でもなあ…timestamp型にしたものは普通に動いてるんですよ。
勝手にtimestamp型のカラムで作成されるcreated_atとupdated_at。
(前略)/activerecord-2.1.1/lib/active_record/connection_adapters/mysql-adapter.rbにあるnative_database_typesメソッドを見てみても、timestamp型はdatetime型に変換されている。で、上手いこと使えている。
同じメソッド内でdatetime型についても書かれています。
def native_database_types #:nodoc: { :primary_key => "int(11) DEFAULT NULL auto_increment PRIMARY KEY".freeze, ・ ・ ・ :datetime => { :name => "datetime" }, :timestamp => { :name => "datetime" }, ・ ・ ・ } end
何やねんと。
何処で何が引っ掛かってるんだ?
えー、どうしよう。