2012-02-10 8 views
11

Rails ':timestampカラムタイプが嘘です。実際には:datetimeのエイリアスです。ActiveRecord/Railsに実際のmysql TIMESTAMPカラムを使用させる

私はmysqlを使用しています。実際のUNIXタイムスタンプTIMESTAMPカラムを使用したいと思います。

)これを設定するには、SQLを使用して列を作成する以外にも、いい方法がありますか?

b)ActiveRecordは適切に対応しますか(たとえば、必要に応じてTimeに変換し、入力としてUnixタイムスタンプIntegerを受け入れるなど)?私は何をしなければならないと思いますか、そしてどこで?

理由:

  1. スピード。これは、すでにUNIXのタイムスタンプを使用している外部のデータソースを集約している非常にアクティブなテーブル用です。 datetimeに変換する(または最初にdbの文字列に変換すると、2 gsubを通過します)、そのインポート時間の大部分を使います。私はそうでなければちょうど安価なInteger#to_s呼び出し汚れをやっている可能性があります。

  2. タイムゾーン。私は彼らを望んでいない。私はそれがタイムゾーンに保存されてほしいと思っています。タイムゾーンを扱うことは苦痛であり、個々のユーザーが表示される前の最後の段階を除いて、私のニーズに完全に無関係です。データそのものは、記録されたタイムゾーンを知る必要はありません。

  3. サイズ。それは大きなテーブルです。 TIMESTAMP is half the size of DATETIME.

はい、私はまだMySQLやコードにupdated_at計算をやっていないことになります。その部分はボトルネックではありません。

あなたの 'なぜ'(私はnoobishの理由を求めていないよ:-P表示するには、先制)間違っている理由:

  1. "しかし、TIMESTAMPの自動更新":That's only true by default, and can be easily switched off.
  2. アイム実際にはRailsを使用していない、単にActiveRecordです。
  3. はい、これはactual profiling dataに基づいています。私は早期に最適化していません。 ActiveRecord::ConnectionAdapters::AbstractMysqlAdapter#quoteQuoting#quoted_date [Timeを渡す場合]またはMysql2Adapter#quote_string [事前変換の場合はto_s(:db)])は、実際にはスクレイパーのCPUを消費する最も多くのセクションです。私はそれを取り除きたい。
+0

あなたがRailsの(#2)を使用している場合、なぜそれは問題でしょうか? (私はRailsを使用していますが、スペースを節約するためにタイムスタンプを使用することを検討しています) –

答えて

0

私はかなりノービッシュですが、私はそれを撃つでしょう。独自のカスタム列を追加するか、デフォルト列を上書きする場合はどうなりますか?

t.add_column :mysql_timestamp, 'timestamp' 

、その後、どこか他のあなたのロジックで

def mysql_timestamp 
    Time.now.strftime("%Y-%m-%d %H:%M:%S") 
end 

NOT Bわから):あなたはそうのような文字列でカスタムデータ型を使用することができます。見つけ出す方法は1つだけです!

+0

'timestamp'カラムタイプはTIMESTAMPではなく、DATETIMEです。 – Sai

+1

はシンボルの場合のみです。文字列を使用する場合は、少なくともこの投稿の@tadmanによれば、あなたが望むものであれば何でも構いません。http://stackoverflow.com/questions/4100209/ruby-rails-active-record-db-migration-to -mysql-timestamp-type#4100341私はそれを試していません。 –

+0

@protolifは説明どおりに動作しません。 – aTei

7

この作品(だけので、定義を入力するための空白文字を追加しました:タイムスタンプはそれを上書きしません):

 t.add_column :sometable, :created_at, 'timestamp '