我正在使用SQL(即execute
)在Rails 3.2中编写迁移,以在数据库级别强制执行应用程序逻辑(外键,默认值,检查,触发器)。原因是我需要一致的数据库交互,以防我需要使用来自不同应用程序(即不是Rails)的相同数据库或直接批量导入数据。除了默认值对于一个模型(见下文)外,一切似乎都很出色。
例如created_at
将包含NOT NULL DEFAULT current_timestamp
。如果我在数据库中创建记录,这一切都很好,但由于某种原因,schema.rb不会检测默认值,而是正确识别NOT NULL
约束。结果是我无法使用Model.create或Model.new(例如BibliographicItem.create(title: "Foo")
)在数据库中保存实例,因为created_at
和updated_at
最终成为{{1} }违反了schema.rb中的nil
约束。
schema.rb中的违规表:
null: false
其型号:
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
分配值?对于我的所有其他模型,具有相似(但更简单的定义)没有问题。
答案 0 :(得分:0)
我发现问题的原因,实际上,它与SQL迁移,created_at或schema.rb 没有,但是由于验证失败validates publication_year, numericality: { only_integer: true, less_than_or_equal_to: Date.today.year() }
publication_year是nil
。
轰击着墙壁。