module RailsSqlViews module ConnectionAdapters # :nodoc: module SchemaStatements def self.included(base) base.alias_method_chain :drop_table, :cascade end # Create a view. # The +options+ hash can include the following keys: # [:check_option] # Specify restrictions for inserts or updates in updatable views. ANSI SQL 92 defines two check option # values: CASCADED and LOCAL. See your database documentation for allowed values. def create_view(name, select_query, options={}) if supports_views? view_definition = ViewDefinition.new(self, select_query) if block_given? yield view_definition end if options[:force] drop_view(name) rescue nil end create_sql = "CREATE VIEW " create_sql << "#{quote_table_name(name)} " if supports_view_columns_definition? && !view_definition.to_sql.blank? create_sql << "(" create_sql << view_definition.to_sql create_sql << ") " end create_sql << "AS #{view_definition.select_query}" create_sql << " WITH #{options[:check_option]} CHECK OPTION" if options[:check_option] execute create_sql end end # Also creates a view, with the specific purpose of remapping column names # to make non-ActiveRecord tables friendly with the naming # conventions, while maintaining legacy app compatibility. def create_mapping_view(old_name, new_name, options = {}) return unless supports_views? col_names = columns(old_name).collect { |col| col.name.to_sym } mapper = MappingDefinition.new(col_names) yield mapper if options[:force] drop_view(new_name) rescue nil end view_sql = "CREATE VIEW #{new_name} " if supports_view_columns_definition? view_sql << "(#{mapper.view_cols.collect { |c| quote_column_name(c) }.join(', ')}) " end view_sql << "AS SELECT #{mapper.select_cols.collect { |c| quote_column_name(c) }.join(', ')} FROM #{old_name}" execute view_sql end def drop_table_with_cascade(table_name, options = {}) execute "DROP TABLE #{quote_table_name(table_name)} CASCADE" end # Drop a view. # The +options+ hash can include the following keys: # [:drop_behavior] # Specify the drop behavior. ANSI SQL 92 defines two drop behaviors, CASCADE and RESTRICT. See your # database documentation to determine what drop behaviors are available. def drop_view(name, options={}) if supports_views? drop_sql = "DROP VIEW #{quote_table_name(name)}" drop_sql << " #{options[:drop_behavior]}" if options[:drop_behavior] execute drop_sql end end end end end