我正在使用SQL(即execute
)在Rails 3.2中編寫遷移,以在數據庫級別實施應用程序邏輯(外鍵,缺省值,檢查,觸發器)。原因是我需要一致的數據庫交互,以防我需要直接使用來自不同應用程序(即不是Rails)或大量導入數據的相同數據庫。除了默認值對於一個型號(見下文),一切似乎都非常出色。使用Rails中的SQL遷移更新updated_at和created_at的默認值的問題?
例如created_at
將包括NOT NULL DEFAULT current_timestamp
。如果我在數據庫中創建記錄,這很好,但由於某種原因,schema.rb沒有檢測到默認值,但是正確地標識了約束條件。結果是我無法使用Model.create或Model.new(例如BibliographicItem.create(title: "Foo")
)在數據庫中保存實例,因爲created_at
和updated_at
最終爲nil
,這違反了schema.rb中的null: false
約束。
在schema.rb的違規表:
create_table "bibliographic_items", :id => false, :force => true do |t|
t.string "uuid", :limit => nil, :null => false
t.string "title", :limit => nil, :null => false
t.integer "publication_year"
t.string "type", :limit => nil, :null => false
t.text "description"
t.datetime "created_at", :null => false
t.datetime "updated_at", :null => false
end
其型號:
class BibliographicItem < ActiveRecord::Base
include Extensions::UUID
attr_accessible :title, :publication_year, :description
has_many :authorships
has_many :authors, through: :authorships, order: "role DESC, author_order DESC NULLS LAST"
validates :title, presence: true, length: { maximum: 500 }
validates :publication_year, numericality: { only_integer: true,
less_than_or_equal_to: Date.today.year() }
end
創建表在execute
聲明:
CREATE TABLE bibliographic_items (
uuid uuid DEFAULT uuid_generate_v4() PRIMARY KEY,
title varchar NOT NULL,
publication_year int CHECK (publication_year <= left(now()::text, 4)::int),
type varchar NOT NULL REFERENCES bibliographic_item_types ON UPDATE CASCADE ON DELETE RESTRICT,
description text,
created_at timestamp without time zone NOT NULL DEFAULT current_timestamp,
updated_at timestamp without time zone NOT NULL DEFAULT current_timestamp,
CHECK (updated_at >= created_at)
);
爲什麼.create
和.new
不分配值爲created_at
和updated_at
?對於我所有的其他模型,使用相似(但更簡單的定義),沒有問題。
我改變了這個問題,因爲我最初並不理解這個問題的範圍...... – Torsti 2012-07-22 10:51:51