提交 5c55aafd 编写于 作者: D Dieter Komendera

Add Enum type to postgresql adapter's oids to prevent unknown OID warnings.

上级 ffcc6172
* Dynamically register PostgreSQL enum OIDs. This prevents "unknown OID"
warnings on enum columns.
*Dieter Komendera*
* `includes` is able to detect the right preloading strategy when string
joins are involved.
......
......@@ -229,6 +229,12 @@ def infinity(options = {})
end
end
class Enum < Type
def type_cast(value)
value.to_s
end
end
class Hstore < Type
def type_cast_for_write(value)
ConnectionAdapters::PostgreSQLColumn.hstore_to_string value
......
......@@ -801,6 +801,12 @@ def initialize_type_map(type_map)
leaves, nodes = nodes.partition { |row| row['typelem'] == '0' }
arrays, nodes = nodes.partition { |row| row['typinput'] == 'array_in' }
# populate the enum types
enums, leaves = leaves.partition { |row| row['typinput'] == 'enum_in' }
enums.each do |row|
type_map[row['oid'].to_i] = OID::Enum.new
end
# populate the base types
leaves.find_all { |row| OID.registered_type? row['typname'] }.each do |row|
type_map[row['oid'].to_i] = OID::NAMES[row['typname']]
......
......@@ -23,6 +23,8 @@ def setup
t.column :current_mood, :mood
end
end
# reload type map after creating the enum type
@connection.send(:reload_type_map)
end
def test_enum_mapping
......@@ -35,4 +37,30 @@ def test_enum_mapping
assert_equal "happy", enum.reload.current_mood
end
def test_invalid_enum_update
@connection.execute "INSERT INTO postgresql_enums VALUES (1, 'sad');"
enum = PostgresqlEnum.first
enum.current_mood = "angry"
assert_raise ActiveRecord::StatementInvalid do
enum.save
end
end
def test_no_oid_warning
@connection.execute "INSERT INTO postgresql_enums VALUES (1, 'sad');"
stderr_output = capture(:stderr) {
enum = PostgresqlEnum.first
}
assert stderr_output.blank?
end
def test_enum_type_cast
enum = PostgresqlEnum.new
enum.current_mood = :happy
assert_equal "happy", enum.current_mood
end
end
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册