在Rails中使用SQL迁移的updated_at和created_at的默认值出现问题?

时间:2012-07-22 10:13:42

标签: sql ruby-on-rails postgresql migration default

我正在使用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_atupdated_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没有为.newcreated_at分配值?对于我的所有其他模型,具有相似(但更简单的定义)没有问题。

1 个答案:

答案 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

轰击着墙壁。