0

モデルを作成していたときに、列 edit:timestamp を作成しました。

t.timestamp :edited # in migration file

ユーザーがこのモデルで何かを編集するたびに、時刻/日付が更新されることを期待していました。

しかし、データベーススキーマでは次のように書き留められているのを見ました

t.datetime "edited"

ユーザーがフォームにデータを入力することを期待しています。

ここで何が起こっているのですか?

SQL DB でタイムスタンプ列を作成するには、移行ファイルをどのように変更すればよいですか? または、モデル自体に割り当てる必要がありますか?

ユーザー入力に依存したくないので、システムセルでなければなりません

どうも。

4

2 に答える 2

6

モデルを作成するときは、ActiveRecord移行を生成して、このモデルに関連付けられたデータを格納するテーブルを作成する必要があります。たとえば、モデルの名前が「Product」の場合、次のコマンドを実行します。

rails g migration create_products_table

これにより、db / migrateに移行ファイルが生成されます(移行ファイルを生成したときのタイムスタンプが前に付けられます(例: "20121201200720_create_products_table.rb"))。

移行ファイルは次のようになります。

class CreateProducts < ActiveRecord::Migration
  def change
    create_table :products do |t|

      t.timestamps
    end
  end
end

この移行(rake db:migrate)を実行すると、ActiveRecordはテーブルに2つの列を自動的に作成します:created_atupdated_at。次に、schema.rb(db内)を確認します。そのようなものがあります:

create_table "products", :force => true do |t|
    t.datetime "created_at", :null => false
    t.datetime "updated_at", :null => false
end

created_at製品が作成されたタイムスタンプを保存します。 updated_at製品が最後に更新されたタイムスタンプ(ここで探しているもの)を保存します

したがって、カスタム列を作成する必要はありません。ActiveRecordの組み込みのタイムスタンプに依存する必要があります。

于 2012-12-02T03:53:05.217 に答える
1

Rails、より具体的には、ActiveRecord はデータベースに依存しないように作成されました。これは、アプリケーションを移行したり、さまざまなデータベースやスタックなどを使用してデプロイしたりする場合に最適です。ただし、課される制限の 1 つは、AR がデータベース固有の機能をサポートしていないことです。

AR 列の種類のリストは、こちらにあります。ご覧のとおり、"timestamp" は AR 列の型ですが、"datetime" 型のエイリアスに近いものです。

したがって、アプリケーションで実際の SQL タイムスタンプ列を使用する場合は、次の 2 つのいずれかを行うことができます。

  1. 移行ファイルを編集して、「t.edited "TIMESTAMP"」を試すことができます (AR ではカスタム タイプを文字列として使用できるため、テストされていませんが動作するはずです)。

  2. データベースに列を作成し、AR がそれを取得できるようにすることができます。

レールを初めて使用する場合は、Gullaume Galuz の回答を使用して、AR に列created_atupdated_at列を処理させることを強くお勧めします。

そうでない場合は、この質問を見て、DB固有のTIMESTAMP列を使用する必要性を明確に説明することもできます。(サイズ、速度、ゾーンなど)

于 2012-12-02T04:18:58.333 に答える