1
0
Fork 0
mirror of https://github.com/rails/rails.git synced 2022-11-09 12:12:34 -05:00

Allow column_exists? to be passed type argument as a string

Currently `conn.column_exists?("testings", "created_at", "datetime")`
returns false even if the table has the `created_at` column.

That reason is that `column.type` is a symbol but passed `type` is not
normalized to symbol unlike `column_name`, it is surprising behavior to
me.

I've improved that to normalize a value before comparison.
This commit is contained in:
Ryuta Kamizono 2019-01-24 19:02:44 +09:00
parent 4a40128a3f
commit 1fecebae31
2 changed files with 5 additions and 10 deletions

View file

@ -134,7 +134,7 @@ module ActiveRecord
column_name = column_name.to_s column_name = column_name.to_s
checks = [] checks = []
checks << lambda { |c| c.name == column_name } checks << lambda { |c| c.name == column_name }
checks << lambda { |c| c.type == type } if type checks << lambda { |c| c.type == type.to_sym rescue nil } if type
column_options_keys.each do |attr| column_options_keys.each do |attr|
checks << lambda { |c| c.send(attr) == options[attr] } if options.key?(attr) checks << lambda { |c| c.send(attr) == options[attr] } if options.key?(attr)
end end

View file

@ -139,8 +139,8 @@ class Mysql2ActiveSchemaTest < ActiveRecord::Mysql2TestCase
with_real_execute do with_real_execute do
ActiveRecord::Base.connection.create_table :delete_me ActiveRecord::Base.connection.create_table :delete_me
ActiveRecord::Base.connection.add_timestamps :delete_me, null: true ActiveRecord::Base.connection.add_timestamps :delete_me, null: true
assert column_present?("delete_me", "updated_at", "datetime") assert column_exists?("delete_me", "updated_at", "datetime")
assert column_present?("delete_me", "created_at", "datetime") assert column_exists?("delete_me", "created_at", "datetime")
ensure ensure
ActiveRecord::Base.connection.drop_table :delete_me rescue nil ActiveRecord::Base.connection.drop_table :delete_me rescue nil
end end
@ -152,8 +152,8 @@ class Mysql2ActiveSchemaTest < ActiveRecord::Mysql2TestCase
t.timestamps null: true t.timestamps null: true
end end
ActiveRecord::Base.connection.remove_timestamps :delete_me, null: true ActiveRecord::Base.connection.remove_timestamps :delete_me, null: true
assert_not column_present?("delete_me", "updated_at", "datetime") assert_not column_exists?("delete_me", "updated_at", "datetime")
assert_not column_present?("delete_me", "created_at", "datetime") assert_not column_exists?("delete_me", "created_at", "datetime")
ensure ensure
ActiveRecord::Base.connection.drop_table :delete_me rescue nil ActiveRecord::Base.connection.drop_table :delete_me rescue nil
end end
@ -194,9 +194,4 @@ class Mysql2ActiveSchemaTest < ActiveRecord::Mysql2TestCase
def method_missing(method_symbol, *arguments) def method_missing(method_symbol, *arguments)
ActiveRecord::Base.connection.send(method_symbol, *arguments) ActiveRecord::Base.connection.send(method_symbol, *arguments)
end end
def column_present?(table_name, column_name, type)
results = ActiveRecord::Base.connection.select_all("SHOW FIELDS FROM #{table_name} LIKE '#{column_name}'")
results.first && results.first["Type"] == type
end
end end