module EnumKit::ActiveRecordExtensions::ConnectionAdapters::PostgreSQLAdapter
Constants
- ENUM_QUERY
@return [String] An SQL query that returns all available enum types in the database.
Public Instance Methods
Add a new value to an enum type in the database.
Note that you can't specify both :before and :after.
@param name [Symbol] The enum's name. @param value [String|Symbol] The value to add. @param after [String|Symbol] An existing value after which the new value should be inserted. @param before [String|Symbol] An existing value before which the new value should be inserted.
# File lib/enum_kit/active_record_extensions/connection_adapters/postgresql_adapter.rb, line 87 def add_enum_value(name, value, after: nil, before: nil) name = EnumKit.sanitize_name!(name) value = EnumKit.sanitize_value!(value) statement = "ALTER TYPE #{name} ADD VALUE #{EnumKit.sqlize(value)}" raise ArgumentError, "You can't specify both :before and :after" if before && after statement += " AFTER #{EnumKit.sqlize(EnumKit.sanitize_value!(after))}" if after statement += " BEFORE #{EnumKit.sqlize(EnumKit.sanitize_value!(before))}" if before enum_execute(statement) end
Clear the cached enums to force a refresh the next time they are accessed.
# File lib/enum_kit/active_record_extensions/connection_adapters/postgresql_adapter.rb, line 32 def clear_enum_cache! @enums = nil end
Create a new enum type in the database.
@param name [Symbol] The enum's name. @param values [Array] The enum's acceptable values.
# File lib/enum_kit/active_record_extensions/connection_adapters/postgresql_adapter.rb, line 49 def create_enum(name, values) name = EnumKit.sanitize_name!(name) values = EnumKit.sanitize_values!(values) enum_execute "CREATE TYPE #{name} AS ENUM #{EnumKit.sqlize(values)}" end
Drop an existing enum type from the database.
@param name [Symbol] The enum's name.
# File lib/enum_kit/active_record_extensions/connection_adapters/postgresql_adapter.rb, line 72 def drop_enum(name) name = EnumKit.sanitize_name!(name) enum_execute "DROP TYPE #{name}" end
@return [Hash] The enum types available in the database.
# File lib/enum_kit/active_record_extensions/connection_adapters/postgresql_adapter.rb, line 38 def enums @enums ||= select_all(ENUM_QUERY.tr("\n", ' ').strip).each_with_object({}) do |row, enums| enums[row['typname'].to_sym] = row['values'].split("\t\t") end end
Rename an existing enum type.
@param current_name [Symbol] The enum's current name. @param new_name [Symbol] The enum's new name.
# File lib/enum_kit/active_record_extensions/connection_adapters/postgresql_adapter.rb, line 61 def rename_enum(current_name, new_name) current_name = EnumKit.sanitize_name!(current_name) new_name = EnumKit.sanitize_name!(new_name) enum_execute "ALTER TYPE #{current_name} RENAME TO #{new_name}" end
Rename a value within an enum type in the database.
@param name [Symbol] The enum's name. @param current_value [String|Symbol] The enum value's current name. @param new_value [String|Symbol] The enum value's new name.
# File lib/enum_kit/active_record_extensions/connection_adapters/postgresql_adapter.rb, line 107 def rename_enum_value(name, current_name, new_name) ensure_renaming_enum_values_is_supported! name = EnumKit.sanitize_name!(name) current_name = EnumKit.sanitize_value!(current_name) new_name = EnumKit.sanitize_value!(new_name) enum_execute "ALTER TYPE #{name} RENAME VALUE #{EnumKit.sqlize(current_name)} TO #{EnumKit.sqlize(new_name)}" end