Changed it to table_options because otherwise could conflict with 
create_join_table which already used column_options.

Pull request: https://github.com/rails/rails/pull/8353

On Wednesday, November 28, 2012 12:58:19 PM UTC-5, Gary Weaver wrote:
>
> Forgot the preceding space, so that line should really be:
>
>         create_sql << " #{options[:column_options]}" if 
> options.has_key?(:column_options)
>
> That way the outputted sql will be same as was before, even if not 
> specifying that option.
>
>
> On Wednesday, November 28, 2012 12:45:35 PM UTC-5, Gary Weaver wrote:
>>
>> So proposal would be in 
>> activerecord/lib/active_record/connection_adapters/abstract/schema_statements.rb
>>
>> You would add :column_options support, like:
>>
>>       def create_table(table_name, options = {})
>>         td = table_definition
>>         td.primary_key(options[:primary_key] || 
>> Base.get_primary_key(table_name.to_s.singularize)) unless options[:id] == 
>> false
>>
>>         yield td if block_given?
>>
>>         if options[:force] && table_exists?(table_name)
>>           drop_table(table_name, options)
>>         end
>>
>>         create_sql = "CREATE#{' TEMPORARY' if options[:temporary]} TABLE "
>>         create_sql << "#{quote_table_name(table_name)} ("
>>         create_sql << td.to_sql
>>         create_sql << "#{options[:column_options]}"
>>         create_sql << ") #{options[:options]}"
>>         execute create_sql
>>         td.indexes.each_pair { |c,o| add_index table_name, c, o }
>>       end
>>
>> Not sure if would want to add similar option in other places to be 
>> consistent, though...
>>
>> On Wednesday, November 28, 2012 12:31:37 PM UTC-5, Gary Weaver wrote:
>>>
>>> For the create_table though, I'm not sure there is a way to specify 
>>> options that go inside the parenthesis.
>>>
>>> For example this fails because it puts deferrable on the outside of the 
>>> parenths:
>>>
>>>     create_table(:test3, :options => 'deferrable') do |t|
>>>       t.string :some_id
>>>     end
>>>
>>> $ rake db:migrate
>>> ==  TestMigration: migrating 
>>> ==================================================
>>> -- create_table(:test3, {:options=>"deferrable"})
>>> rake aborted!
>>> An error has occurred, this and all later migrations canceled:
>>>
>>> PG::Error: ERROR:  syntax error at or near "deferrable"
>>> LINE 1: ...al primary key, "some_id" character varying(255)) deferrable
>>>
>>> Maybe there should be a concept like column_options: 'deferrable'
>>>
>>>     create_table(:test3, :column_options => 'deferrable') do |t|
>>>       t.string :some_id
>>>     end
>>>
>>> ?
>>>
>>> On Wednesday, November 28, 2012 11:55:57 AM UTC-5, Gary Weaver wrote:
>>>>
>>>> afaik using foreigner is still the recommended way to handle fkeys in 
>>>> Rails. Here is the pull request in foreigner where they discuss deferrable 
>>>> a few years ago: https://github.com/matthuhiggins/foreigner/pull/32
>>>>
>>>> Using Foreigner v0.9.1 or later and using structure.sql vs. schema.rb 
>>>> then can specify :options in foreigner's add_foreign_key, e.g.
>>>>
>>>> add_foreign_key(:employees, :companies, :options => 'deferrable')
>>>>
>>>> Related rails ticket which had no follow through, mostly related to 
>>>> deferred use in fixtures: https://github.com/rails/rails/issues/5523
>>>>
>>>> Unrelated, but for those interested, sequel just added support for 
>>>> deferrable constraints in pg: 
>>>> https://github.com/jeremyevans/sequel/pull/583
>>>>
>>>> Hope that helps.
>>>>
>>>> On Thursday, November 22, 2012 9:36:18 AM UTC-5, Rodrigo Rosenfeld 
>>>> Rosas wrote:
>>>>>
>>>>>  Although I don't use ActiveRecord as an ORM, I do use its migrations 
>>>>> framework for evolving my database schema through standalone_migrations.
>>>>>
>>>>> But I'm finding the current DSL limited with regards to deferrable 
>>>>> constraints support.
>>>>>
>>>>> Let me demonstrate with a common use-case, like trees implementation, 
>>>>> with SQL written for PostgreSQL:
>>>>>
>>>>> create table tree(parent_id integer not null, position integer not 
>>>>> null, unique(parent_id, position));
>>>>> insert into tree(parent_id, position) select generate_series(1, 3), 1;
>>>>> insert into tree(parent_id, position) select generate_series(1, 3), 2;
>>>>>
>>>>> update tree set position = position + 1;
>>>>>
>>>>> ERROR:  duplicate key value violates unique constraint 
>>>>> "tree_parent_id_position_key"
>>>>>
>>>>> In PostgreSQL the constraint check is performed during the UPDATE, so 
>>>>> its success will depend on what order PG will try to update the 
>>>>> "position" 
>>>>> field.
>>>>>
>>>>> Since we want PG to defer the constraint check to the end of the 
>>>>> UPDATE statement (it is also possible to specify constraints to be check 
>>>>> on 
>>>>> transaction commit, but I'll keep this short) we must create this "tree" 
>>>>> table in PG like this:
>>>>>
>>>>> create table tree(parent_id integer not null, position integer not 
>>>>> null, unique(parent_id, position) *deferrable*);
>>>>>
>>>>> But there is no DSL support in migrations to tell the database to use 
>>>>> a deferrable constraint when supported by the database.
>>>>>
>>>>> Also, I believe that deferrable should be the default and one should 
>>>>> specify "deferrable: false" if this is not desired in case add_index 
>>>>> would 
>>>>> support a "deferrable" option. In such case, it should generate a 
>>>>> statement 
>>>>> like:
>>>>>
>>>>> alter table :table_name add constraint :constraint_name unique 
>>>>> (parent_id, position) deferrable
>>>>>
>>>>> Another option would be to introduce some "add_constraint" DSL to 
>>>>> Migrations. Anyway, there should be some way of stating this deferrable 
>>>>> information in schema.rb.
>>>>>
>>>>> Each approach would be fine to me as long as I don't need to do it 
>>>>> myself using PG-specific SQL with "execute" method.
>>>>>
>>>>> Thanks for considering,
>>>>> Rodrigo.
>>>>>
>>>>>  

-- 
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/-/T0j4B2mbMlEJ.
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