提交 8eb536e7 编写于 作者: S Sean Griffin

Result sets never override a model's column type

MySQL and PostgreSQL provide a column type override in order to properly
type cast computed columns included in a result set. This should never
override the known types of full fledged columns. In addition to messing
up computed properties, this would have led to inconsistent behavior
between a record created with `new`, and a record created with `last` on
the mysql adapter in the following cases:

- `tinyint(1)` with `emulate_booleans` set to `false`
- `text`, `string`, `binary`, and `decimal` columns
上级 29f8eae3
...@@ -40,7 +40,7 @@ def find_by_sql(sql, binds = []) ...@@ -40,7 +40,7 @@ def find_by_sql(sql, binds = [])
column_types = {} column_types = {}
if result_set.respond_to? :column_types if result_set.respond_to? :column_types
column_types = result_set.column_types column_types = result_set.column_types.merge(columns_hash)
else else
ActiveSupport::Deprecation.warn "the object returned from `select_all` must respond to `column_types`" ActiveSupport::Deprecation.warn "the object returned from `select_all` must respond to `column_types`"
end end
......
require "cases/helper"
class MysqlConsistencyTest < ActiveRecord::TestCase
self.use_transactional_fixtures = false
class Consistency < ActiveRecord::Base
self.table_name = "mysql_consistency"
end
setup do
@old_emulate_booleans = ActiveRecord::ConnectionAdapters::MysqlAdapter.emulate_booleans
ActiveRecord::ConnectionAdapters::MysqlAdapter.emulate_booleans = false
@connection = ActiveRecord::Base.connection
@connection.create_table("mysql_consistency") do |t|
t.boolean "a_bool"
t.string "a_string"
end
Consistency.reset_column_information
Consistency.create!
end
teardown do
ActiveRecord::ConnectionAdapters::MysqlAdapter.emulate_booleans = @old_emulate_booleans
@connection.drop_table "mysql_consistency"
end
test "boolean columns with random value type cast to 0 when emulate_booleans is false" do
with_new = Consistency.new
with_last = Consistency.last
with_new.a_bool = 'wibble'
with_last.a_bool = 'wibble'
assert_equal 0, with_new.a_bool
assert_equal 0, with_last.a_bool
end
test "string columns call #to_s" do
with_new = Consistency.new
with_last = Consistency.last
thing = Object.new
with_new.a_string = thing
with_last.a_string = thing
assert_equal thing.to_s, with_new.a_string
assert_equal thing.to_s, with_last.a_string
end
end
...@@ -37,7 +37,9 @@ def test_overloaded_properties_save ...@@ -37,7 +37,9 @@ def test_overloaded_properties_save
data.reload data.reload
assert_equal 2, data.overloaded_float assert_equal 2, data.overloaded_float
assert_kind_of Fixnum, OverloadedType.last.overloaded_float
assert_equal 2.0, UnoverloadedType.last.overloaded_float assert_equal 2.0, UnoverloadedType.last.overloaded_float
assert_kind_of Float, UnoverloadedType.last.overloaded_float
end end
def test_properties_assigned_in_constructor def test_properties_assigned_in_constructor
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册