split_node_tags: Implement key constraints.

This commit is contained in:
Gabriel Ebner 2008-05-04 08:25:29 +00:00
parent 71e390bf31
commit ba01b66242
2 changed files with 51 additions and 0 deletions

View file

@ -0,0 +1,41 @@
class KeyConstraints < ActiveRecord::Migration
def self.up
# Primary keys
add_primary_key :current_node_tags, [:id, :k]
add_primary_key :current_way_tags, [:id, :k]
add_primary_key :current_relation_tags, [:id, :k]
add_primary_key :node_tags, [:id, :version, :k]
add_primary_key :way_tags, [:id, :version, :k]
add_primary_key :relation_tags, [:id, :version, :k]
add_primary_key :nodes, [:id, :version]
# Foreign keys (between ways, way_tags, way_nodes, etc.)
add_foreign_key :current_node_tags, [:id], :current_nodes
add_foreign_key :node_tags, [:id, :version], :nodes
add_foreign_key :current_way_tags, [:id], :current_ways
add_foreign_key :current_way_nodes, [:id], :current_ways
add_foreign_key :way_tags, [:id, :version], :ways
add_foreign_key :way_nodes, [:id, :version], :ways
add_foreign_key :current_relation_tags, [:id], :current_relations
add_foreign_key :current_relation_members, [:id], :current_relations
add_foreign_key :relation_tags, [:id, :version], :relations
add_foreign_key :relation_members, [:id, :version], :relations
# Foreign keys (between different types of primitives)
add_foreign_key :current_way_nodes, [:node_id], :current_nodes, [:id]
# FIXME: We don't have foreign keys for relation members since the id
# might point to a different table depending on the `type' column.
# We'd probably need different current_relation_member_nodes,
# current_relation_member_ways and current_relation_member_relations
# tables for this to work cleanly.
end
def self.down
raise IrreversibleMigration.new
end
end

View file

@ -1,6 +1,10 @@
module ActiveRecord
module ConnectionAdapters
module SchemaStatements
def quote_column_names(column_name)
Array(column_name).map { |e| quote_column_name(e) }.join(", ")
end
def add_primary_key(table_name, column_name, options = {})
column_names = Array(column_name)
quoted_column_names = column_names.map { |e| quote_column_name(e) }.join(", ")
@ -11,6 +15,12 @@ module ActiveRecord
execute "ALTER TABLE #{table_name} DROP PRIMARY KEY"
end
def add_foreign_key(table_name, column_name, reftbl, refcol = nil)
execute "ALTER TABLE #{table_name} ADD " +
"FOREIGN KEY (#{quote_column_names(column_name)}) " +
"REFERENCES #{reftbl} (#{quote_column_names(refcol || column_name)})"
end
alias_method :old_options_include_default?, :options_include_default?
def options_include_default?(options)