rake test not copying development postgres db with sequences

风格不统一 提交于 2019-12-25 10:16:11

问题


I am trying to develop a rails application on postgresql using a sequence to increment a field instead of a default ruby approach based on validates_uniqueness_of.

This has proved challenging for a number of reasons: 1. This is a migration of an existing table, not a new table or column 2. Using parameter :default => "nextval('seq')" didn't work because it tries to set it in parenthesis 3. Eventually got migration working in 2 steps:

change_column :work_commencement_orders, :wco_number_suffix, :integer, :null => false#, :options => "set default nextval('wco_number_suffix_seq')"

execute %{
  ALTER TABLE work_commencement_orders ALTER COLUMN wco_number_suffix SET DEFAULT nextval('wco_number_suffix_seq');
}

Now this would appear to have done the correct thing in the development database and the schema looks like:

wco_number_suffix      | integer                     | not null default nextval('wco_number_suffix_seq'::regclass)

However, the tests are failing with

PGError: ERROR:  null value in column "wco_number_suffix" violates not-null constraint
: INSERT INTO "work_commencement_orders" ("expense_account_id", "created_at", 
"process_id", "vo2_issued_on", "wco_template", "updated_at", "notes", "process_type", 
"vo_number", "vo_issued_on", "vo2_number", "wco_type_id", "created_by", 
"contractor_id", "old_wco_type", "master_wco_number", "deadline", "updated_by", 
"detail", "elective_id", "authorization_batch_id", "delivery_lat", "delivery_long", 
"operational", "state", "issued_on", "delivery_detail") VALUES(226, '2010-05-31 
07:02:16.764215', 728, NULL, E'Default', '2010-05-31 07:02:16.764215', NULL, 
E'Procurement::Process', NULL, NULL, NULL, 226, NULL, 276, NULL, E'MWCO-213', 
'2010-06-14 07:02:16.756952', NULL, E'Name 4597', 220, NULL, NULL, NULL, 'f', 
E'pending', NULL, E'728 Test Road; Test Town; 1234; Test Land') RETURNING "id"

The explanation can be found when you inspect the schema of the test database:

wco_number_suffix      | integer                     | not null

So what happened to the default?

I tried adding

task:
    template: smmt_ops_development

to the database.yml file which has the effect of issuing

create database smmt_ops_test template = "smmt_ops_development" encoding = 'utf8'

I have verified that if I issue this then it does in fact copy the default nextval. So clearly rails is doing something after that to suppress it again.

Any suggestions as to how to fix this?

Thanks Robert


回答1:


I didn't solve the problem as such but developed the following workaround for the work_commencement_orders model to enable the tests to run.

###########################################################################
###########################################################################
# NOTE this is purely for test, it should have no effect on development or production
# as the field will be marked readonly and prevented from being written to the db so that
# it picks up a default value from its sequence.
public

def before_validation
  if wco_number_suffix.blank?
    maximum = WorkCommencementOrder::Entity.maximum(:wco_number_suffix)
    maximum ||= 0
    self.wco_number_suffix = maximum + 1
  end
end

private

def test?
  @is_test ||= (ENV['RAILS_ENV'] == 'test')
end

# Override default behaviour so that when not in test environment it does not try
# to write readonly attributes during create but instead allows them to be initialised
# by default value.
def attributes_with_quotes(include_primary_key = true, include_readonly_attributes = test?, attribute_names = @attributes.keys)
  super(include_primary_key, include_readonly_attributes, attribute_names)
end

###########################################################################
###########################################################################



回答2:


I stumbled into the same issue. For future visitors

Basically put this in your config/environments/development.rb and run your tests.

    config.active_record.schema_format = :sql

For more info - https://rails.lighthouseapp.com/projects/8994/tickets/5849-rails3-rake-task-dbtestprepare-no-longer-handles-stored-procedures



来源:https://stackoverflow.com/questions/2942460/rake-test-not-copying-development-postgres-db-with-sequences

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!