db/schema.rb not preserving constraints...

Is there some magic that's required to have db/schema.rb contain various execute() methods that exist in the migrations files?

For example, suppose in a migration I have the following:

### BEGIN create_table 'foo' do |t|   t.text :name, :null => false end

execute "ALTER TABLE public.foo ADD CHECK(trim(name) = name AND length(name) > 2)" ### END

Is there a way to preserve this extra DDL foo so that it's preserved in db/schema.rb? As is, the rake test framework is arguably broken for PostgreSQL because the db/schema.rb is always recreated without the other DDL required to make a functional schema for the application.

Is that a fair assessment?

-sc

Is there some magic that's required to have db/schema.rb contain various execute() methods that exist in the migrations files?

Unfortunately not. Switching to the sql schema dumper should help (in
environment.rb)

Fred

I'd also suggest that what you're proposing to do is not a very 'Rails' thing to do. One of the "strong opinions" of Rails is that you should consolidate your coding into a single language, and DB management should, if at all possible, take place in the application, _not_ the db. You could accomplish what you're asking about as follows:

class Foo < ARec::Base   validates_length_of :name, :minimum=>3   before_validation :trim_name

  protected   def trim_name     name.strip   end end

Certainly you're free to do it as you've suggested and that may be most appropriate for your solution. However, some things that are difficult to do in Rails are difficult on purpose.

Setting:

Rails::Initializer.run do |config|   config.active_record.schema_format = :sql end

in environment.rb did the trick... that and granting superuser privs to the test user. Thanks!

I'd also suggest that what you're proposing to do is not a very 'Rails' thing to do.

Oooh.. yeah, I fundamentally reject that premise. In fact, Rails should default to using `pg_dump --schema-only` for generating schema for PostgreSQL, and likely doing the same for all database vendors. Rails' schema dump isn't complete and relying on it for completeness should horrify people.

One of the "strong opinions" of Rails is that you should consolidate your coding into a single language, and DB management should, if at all possible, take place in the application, _not_ the db.

I know that's the opinion of Rails, but unfortunately MySQL brain rot has been successful in negatively impacting the design of Rails. validates_* is an organic hack to workaround MySQL deficiencies. I like that ruby checks data, but ruby can't provide data guarantees - only the database can.

However, some things that are difficult to do in Rails are difficult on purpose.

Grr... "'mother, may I,' anti-foot shooting" is a design argument of convenience, not because of correctness, elegance, or completeness.

Just some outside perspective. -sc

Wow. Can I add you to my Christmas card list?

Using this gem: https://github.com/vprokopchuk256/mv-core you can do it in this way:

def change

create_table :foo do |t|

t.text :name, presence: true, custom: { statement: ‘TRIM({name}) = {name}’, as: :check }

end

end

Best regards,

Valeriy Prokopchuk

пʼятниця, 25 квітня 2008 р. 05:36:29 UTC+3 користувач Sean Chittenden написав: