aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord
diff options
context:
space:
mode:
authorSean Griffin <sean@seantheprogrammer.com>2015-11-19 09:30:18 -0700
committerSean Griffin <sean@seantheprogrammer.com>2015-11-19 09:38:27 -0700
commit8246b593bff71f2cebf274c133bb8917f1e094c8 (patch)
tree0499bf109010d3c96becd121141dacbe39f5bcc5 /activerecord
parent7e200f2973fd063b4819bfc584ef7b4b3e66603d (diff)
downloadrails-8246b593bff71f2cebf274c133bb8917f1e094c8.tar.gz
rails-8246b593bff71f2cebf274c133bb8917f1e094c8.tar.bz2
rails-8246b593bff71f2cebf274c133bb8917f1e094c8.zip
Allow specifying the default table options for mysql adapters
It's often the case that you want to have an option that you cannot specify at the database level, but want applied to *all* tables that you create. For example, you might want to specify `ROW_FORMAT=DYNAMIC` to not have to limit text columns to length 171 for indexing when using utf8mb4. This allows an easy way to specify this in your database configuration. While this change affects both MySQL and MySQL2, the test only covers MySQL2, as the legacy mysql adapter appears to always return ASCII strings, and is tangential to what we're actually doing.
Diffstat (limited to 'activerecord')
-rw-r--r--activerecord/CHANGELOG.md5
-rw-r--r--activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb3
-rw-r--r--activerecord/test/cases/migration_test.rb19
3 files changed, 26 insertions, 1 deletions
diff --git a/activerecord/CHANGELOG.md b/activerecord/CHANGELOG.md
index 2461dd517b..31bdbdf1d1 100644
--- a/activerecord/CHANGELOG.md
+++ b/activerecord/CHANGELOG.md
@@ -1,3 +1,8 @@
+* Allow specifying the default options for new tables on mysql and mysql2 in
+ database.yml, via the key `default_table_options`.
+
+ *Sean Griffin*
+
* Except keys of `build_record`'s argument from `create_scope` in `initialize_attributes`.
Fixes #21893.
diff --git a/activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb b/activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb
index deef246c37..a6adc06633 100644
--- a/activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb
+++ b/activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb
@@ -597,7 +597,8 @@ module ActiveRecord
end
def create_table(table_name, options = {}) #:nodoc:
- super(table_name, options.reverse_merge(:options => "ENGINE=InnoDB"))
+ default_table_options = @config.fetch(:default_table_options, "ENGINE=InnoDB")
+ super(table_name, options.reverse_merge(options: default_table_options))
end
def bulk_change_table(table_name, operations) #:nodoc:
diff --git a/activerecord/test/cases/migration_test.rb b/activerecord/test/cases/migration_test.rb
index c3c204cf9f..58cbb80e31 100644
--- a/activerecord/test/cases/migration_test.rb
+++ b/activerecord/test/cases/migration_test.rb
@@ -1020,4 +1020,23 @@ class CopyMigrationsTest < ActiveRecord::TestCase
ActiveRecord::Base.logger = old
end
+ if current_adapter?(:Mysql2Adapter)
+ def test_default_table_options
+ config = ActiveRecord::Base.configurations['arunit'].merge(
+ encoding: 'utf8mb4',
+ default_table_options: "ENGINE=InnoDB CHARACTER SET utf8mb4",
+ )
+ ActiveRecord::Base.establish_connection(config)
+
+ ActiveRecord::Base.connection.create_table(:foos) do |t|
+ t.string :emoji
+ end
+ ActiveRecord::Base.connection.execute("INSERT INTO foos (emoji) VALUES ('💩')")
+ emoji = ActiveRecord::Base.connection.execute("SELECT emoji FROM foos").first.first
+ assert_equal "💩", emoji
+ ensure
+ ActiveRecord::Base.connection.drop_table(:foos, if_exists: true)
+ ActiveRecord::Base.establish_connection(:arunit)
+ end
+ end
end