diff options
author | Ryuta Kamizono <kamipo@gmail.com> | 2015-12-15 05:26:14 +0900 |
---|---|---|
committer | Jeremy Daer <jeremydaer@gmail.com> | 2017-02-01 22:13:46 -0700 |
commit | 65bf1c60053e727835e06392d27a2fb49665484c (patch) | |
tree | 02a5a5b0cead003b2d24c2419585748830b4416e /activerecord/lib/active_record/connection_adapters/mysql/schema_definitions.rb | |
parent | c98e08df7a303f4c7d6d37aa638d4ce97bb1ec9c (diff) | |
download | rails-65bf1c60053e727835e06392d27a2fb49665484c.tar.gz rails-65bf1c60053e727835e06392d27a2fb49665484c.tar.bz2 rails-65bf1c60053e727835e06392d27a2fb49665484c.zip |
Virtual/generated column support for MySQL 5.7.5+ and MariaDB 5.2.0+
MySQL generated columns: https://dev.mysql.com/doc/refman/5.7/en/create-table-generated-columns.html
MariaDB virtual columns: https://mariadb.com/kb/en/mariadb/virtual-computed-columns/
Declare virtual columns with `t.virtual name, type: …, as: "expression"`.
Pass `stored: true` to persist the generated value (false by default).
Example:
create_table :generated_columns do |t|
t.string :name
t.virtual :upper_name, type: :string, as: "UPPER(name)"
t.virtual :name_length, type: :integer, as: "LENGTH(name)", stored: true
t.index :name_length # May be indexed, too!
end
Closes #22589
Diffstat (limited to 'activerecord/lib/active_record/connection_adapters/mysql/schema_definitions.rb')
-rw-r--r-- | activerecord/lib/active_record/connection_adapters/mysql/schema_definitions.rb | 24 |
1 files changed, 14 insertions, 10 deletions
diff --git a/activerecord/lib/active_record/connection_adapters/mysql/schema_definitions.rb b/activerecord/lib/active_record/connection_adapters/mysql/schema_definitions.rb index f1ba0cb708..76ebd0bf6c 100644 --- a/activerecord/lib/active_record/connection_adapters/mysql/schema_definitions.rb +++ b/activerecord/lib/active_record/connection_adapters/mysql/schema_definitions.rb @@ -3,8 +3,7 @@ module ActiveRecord module MySQL module ColumnMethods def primary_key(name, type = :primary_key, **options) - options[:auto_increment] = true if [:primary_key, :integer, :bigint].include?(type) && !options.key?(:default) - options[:limit] = 8 if [:primary_key].include?(type) + options[:auto_increment] = true if [:integer, :bigint].include?(type) && !options.key?(:default) super end @@ -58,24 +57,29 @@ module ActiveRecord end class ColumnDefinition < ActiveRecord::ConnectionAdapters::ColumnDefinition - attr_accessor :charset, :unsigned + attr_accessor :charset, :unsigned, :stored end class TableDefinition < ActiveRecord::ConnectionAdapters::TableDefinition include ColumnMethods def new_column_definition(name, type, options) # :nodoc: - column = super - case column.type + case type + when :virtual + type = options[:type] when :primary_key - column.type = :integer - column.auto_increment = true + type = :integer + options[:limit] ||= 8 + options[:auto_increment] = true + options[:primary_key] = true when /\Aunsigned_(?<type>.+)\z/ - column.type = $~[:type].to_sym - column.unsigned = true + type = $~[:type].to_sym + options[:unsigned] = true end - column.unsigned ||= options[:unsigned] + column = super + column.unsigned = options[:unsigned] column.charset = options[:charset] + column.stored = options[:stored] column end |