db/schema.rb not preserving constraints...

16 views
Skip to first unread message

Sean Chittenden

unread,
Apr 24, 2008, 10:36:29 PM4/24/08
to Ruby on Rails: Talk
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

Frederick Cheung

unread,
Apr 25, 2008, 3:24:33 AM4/25/08
to rubyonra...@googlegroups.com

On 25 Apr 2008, at 03:36, Sean Chittenden wrote:

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

AndyV

unread,
Apr 25, 2008, 8:51:53 AM4/25/08
to Ruby on Rails: Talk
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.

On Apr 25, 3:24 am, Frederick Cheung <frederick.che...@gmail.com>
wrote:

Sean Chittenden

unread,
Apr 25, 2008, 12:46:49 PM4/25/08
to Ruby on Rails: Talk
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

AndyV

unread,
Apr 25, 2008, 4:01:31 PM4/25/08
to Ruby on Rails: Talk
Wow. Can I add you to my Christmas card list?

Valera Prokopchuk

unread,
Jan 23, 2015, 3:37:41 PM1/23/15
to rubyonra...@googlegroups.com, se...@chittenden.org
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 написав:
Reply all
Reply to author
Forward
0 new messages