Em 29-11-2012 09:21, Gary Weaver escreveu:
Rodrigo,

We're using postgres with structure.sql and a legacy DB that has plenty of constraints (fkey, unique) and in the Rails app using that schema for new migrations we're using foreigner ( https://github.com/matthuhiggins/foreigner ) to add new fkeys, and iirc using add_index for some unique constraints (a la http://stackoverflow.com/a/3370333/178651 ). I've read mixed things about using deferrable for everything, but it might be appropriate in some apps.

AR supports using execute to add/remove constraints, etc. also, and foreigner supports deferrable via specifying new constraints like:

add_foreign_key(:employees, :companies, :options => 'deferrable')

Rails create_table I think may be the only place that doesn't allow custom SQL for constraint definition, and I got schooled on that yesterday when trying to allow a spot for custom SQL within the parenths of the generated SQL for create table. :)

I agree that Rails could be more constraint-friendly, but I think you can accomplish what you are trying to do with what is there?

I really don't understand this argument. You could really just get rid of all DSL in migrations and keep only "execute" with no loss of functionality, right? You could as well just use SQL everywhere in your application instead of relying on any kind of ORM, right?

Here is another common usage example from another popular gem that would have problem when "add_index [:parent_id, :position], unique:true" is used:

acts_as_list scope: :parent (see meaning here: https://github.com/swanandp/acts_as_list/blob/master/lib/acts_as_list/active_record/acts/list.rb#L20) https://github.com/swanandp/acts_as_list/blob/master/lib/acts_as_list/active_record/acts/list.rb#L179 (problematic implementation when add_index is used with unique: true)

I don't understand why AR migrations insists that foreign keys are not much important to be included by default. There have always been external gems to add support DSL to foreign keys but some of them are no longer maintained after a while. This is the main problem in my opinion. You rely on another gem, like foreigner, and then some years later when a new AR is released at some point you don't get more support from that gem. I don't recall the name right now but there was a quite popular gem in Rails 1 era to add foreign keys constraints to AR migrations DSL that is no longer maintained.

If the Rails community can't convince itself about the importance of basic things in ACID databases like transactions, foreign keys and other constraints than I think I'm out of luck with regards to deferrable constraints... :( (yes, when I talk about transactions I mean the huge amount of Rails applications out there running MySql with MyISAM engine, that used to be the default one until recently in 5.5 when the InnoDB is now the default one).

When developing open-source applications (like Redmine, Gitorious, etc) you usually want to support as many database vendors as possible. So, what happens if some application like this uses your proposed solution?

add_foreign_key(:employees, :companies, :options => 'deferrable')

What is the effect of the code above in such scenario if a user wants to run the code on MySql or MS SQL Server?


On Thursday, November 29, 2012 5:59:11 AM UTC-5, Rodrigo Rosenfeld Rosas wrote:

    I think I'm late at the party and lost a lot happening here
    yesterday...

    At least it is good to know what core considers a good fit or not
    for AR Migrations. Since constraints are a fundamental piece in my
    projects I get the warning "you should avoid AR at all, including
    AR migrations". Currently it is not a big deal for me as I don't
    plan to support any other database vendor than PG so I can keep
    using "execute" in my migrations but I thought that maybe some OSS
    projects could benefit from some built-in support in AR migrations
    when using a popular plugin like this one:

    
https://github.com/collectiveidea/awesome_nested_set/blob/master/lib/awesome_nested_set/awesome_nested_set.rb#L655
    
<https://github.com/collectiveidea/awesome_nested_set/blob/master/lib/awesome_nested_set/awesome_nested_set.rb#L655>

    I don't really believe the method above will always work in PG,
    for example, if some OSS project has created an index like:

    add_index :some_table, [:parent_id, :lft], unique: true
    add_index :some_table, [:parent_id, :rgt], unique: true

    The Rails community still doesn't seem to be mature enough yet
    with regards to database constraints, which is unfortunate, so I
    believe most people using awesome_nested_set (I never used, just
    took some popular gem as an example) don't have the indices above
    in their migration. And if it happens for an OSS project to have
    an unique index like above it is likely that it won't always work
    in PG unless the OSS project uses a custom "add_unique_index" that
    would be portable among database vendors to include the deferrable
    constraint instead for databases like PG.

    I just suggested that unique constraints/indices should be
    deferrable by default to avoid the problem above, which seems to
    be a very common use-case. Otherwise the message that comes to me
    is "if you're not doing MySql, get away from AR. we just pretend
    to support PG, but if you need first-class support, you should be
    really considering a more robust ORM, like Sequel".

    Em 28-11-2012 17:15, Rafael Mendonça França escreveu:
    I don't think this is a good fit for the core.

    You are able to use SQL statements inside your migrations, so we
    already support this.

    Rafael Mendonça França
    http://twitter.com/rafaelfranca <http://twitter.com/rafaelfranca>
    https://github.com/rafaelfranca <https://github.com/rafaelfranca>


--
You received this message because you are subscribed to the Google Groups "Ruby on Rails: Core" group. To view this discussion on the web visit https://groups.google.com/d/msg/rubyonrails-core/-/YhSw7VXH1kEJ.
To post to this group, send email to rubyonrails-core@googlegroups.com.
To unsubscribe from this group, send email to rubyonrails-core+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/rubyonrails-core?hl=en.

--
You received this message because you are subscribed to the Google Groups "Ruby on 
Rails: Core" group.
To post to this group, send email to rubyonrails-core@googlegroups.com.
To unsubscribe from this group, send email to 
rubyonrails-core+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/rubyonrails-core?hl=en.

Reply via email to