Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
张重言
rails
提交
0916f88f
R
rails
项目概览
张重言
/
rails
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
R
rails
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
0916f88f
编写于
2月 20, 2013
作者:
R
Rafael Mendonça França
浏览文件
操作
浏览文件
下载
差异文件
Merge pull request #8645 from senny/rename_index_on_rename_column
also rename indexes when a table or column is renamed
上级
20ed3e0f
39eef1a5
变更
7
隐藏空白更改
内联
并排
Showing
7 changed file
with
73 addition
and
8 deletion
+73
-8
activerecord/CHANGELOG.md
activerecord/CHANGELOG.md
+5
-0
activerecord/lib/active_record/connection_adapters/abstract/schema_statements.rb
..._record/connection_adapters/abstract/schema_statements.rb
+22
-0
activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb
...tive_record/connection_adapters/abstract_mysql_adapter.rb
+2
-0
activerecord/lib/active_record/connection_adapters/postgresql/schema_statements.rb
...ecord/connection_adapters/postgresql/schema_statements.rb
+6
-3
activerecord/lib/active_record/connection_adapters/sqlite3_adapter.rb
.../lib/active_record/connection_adapters/sqlite3_adapter.rb
+4
-2
activerecord/test/cases/migration/rename_column_test.rb
activerecord/test/cases/migration/rename_column_test.rb
+23
-2
activerecord/test/cases/migration/rename_table_test.rb
activerecord/test/cases/migration/rename_table_test.rb
+11
-1
未找到文件。
activerecord/CHANGELOG.md
浏览文件 @
0916f88f
## Rails 4.0.0 (unreleased) ##
*
Rename related indexes on
`rename_table`
and
`rename_column`
. This
does not affect indexes with custom names.
*Yves Senn*
*
Prevent the creation of indices with too long names, which cause
internal operations to fail (sqlite3 adapter only). The method
`allowed_index_name_length`
defines the length limit enforced by
...
...
activerecord/lib/active_record/connection_adapters/abstract/schema_statements.rb
浏览文件 @
0916f88f
...
...
@@ -696,6 +696,28 @@ def columns_for_remove(table_name, *column_names)
column_names
.
map
{
|
column_name
|
quote_column_name
(
column_name
)
}
end
def
rename_table_indexes
(
table_name
,
new_name
)
indexes
(
new_name
).
each
do
|
index
|
generated_index_name
=
index_name
(
table_name
,
column:
index
.
columns
)
if
generated_index_name
==
index
.
name
rename_index
new_name
,
generated_index_name
,
index_name
(
new_name
,
column:
index
.
columns
)
end
end
end
def
rename_column_indexes
(
table_name
,
column_name
,
new_column_name
)
column_name
,
new_column_name
=
column_name
.
to_s
,
new_column_name
.
to_s
indexes
(
table_name
).
each
do
|
index
|
next
unless
index
.
columns
.
include?
(
new_column_name
)
old_columns
=
index
.
columns
.
dup
old_columns
[
old_columns
.
index
(
new_column_name
)]
=
column_name
generated_index_name
=
index_name
(
table_name
,
column:
old_columns
)
if
generated_index_name
==
index
.
name
rename_index
table_name
,
generated_index_name
,
index_name
(
table_name
,
column:
index
.
columns
)
end
end
end
private
def
table_definition
TableDefinition
.
new
(
self
)
...
...
activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb
浏览文件 @
0916f88f
...
...
@@ -468,6 +468,7 @@ def bulk_change_table(table_name, operations) #:nodoc:
# rename_table('octopuses', 'octopi')
def
rename_table
(
table_name
,
new_name
)
execute
"RENAME TABLE
#{
quote_table_name
(
table_name
)
}
TO
#{
quote_table_name
(
new_name
)
}
"
rename_table_indexes
(
table_name
,
new_name
)
end
def
add_column
(
table_name
,
column_name
,
type
,
options
=
{})
...
...
@@ -495,6 +496,7 @@ def change_column(table_name, column_name, type, options = {}) #:nodoc:
def
rename_column
(
table_name
,
column_name
,
new_column_name
)
#:nodoc:
execute
(
"ALTER TABLE
#{
quote_table_name
(
table_name
)
}
#{
rename_column_sql
(
table_name
,
column_name
,
new_column_name
)
}
"
)
rename_column_indexes
(
table_name
,
column_name
,
new_column_name
)
end
# Maps logical Rails types to MySQL-specific data types.
...
...
activerecord/lib/active_record/connection_adapters/postgresql/schema_statements.rb
浏览文件 @
0916f88f
...
...
@@ -321,14 +321,16 @@ def primary_key(table)
#
# Example:
# rename_table('octopuses', 'octopi')
def
rename_table
(
name
,
new_name
)
def
rename_table
(
table_
name
,
new_name
)
clear_cache!
execute
"ALTER TABLE
#{
quote_table_name
(
name
)
}
RENAME TO
#{
quote_table_name
(
new_name
)
}
"
execute
"ALTER TABLE
#{
quote_table_name
(
table_
name
)
}
RENAME TO
#{
quote_table_name
(
new_name
)
}
"
pk
,
seq
=
pk_and_sequence_for
(
new_name
)
if
seq
==
"
#{
name
}
_
#{
pk
}
_seq"
if
seq
==
"
#{
table_
name
}
_
#{
pk
}
_seq"
new_seq
=
"
#{
new_name
}
_
#{
pk
}
_seq"
execute
"ALTER TABLE
#{
quote_table_name
(
seq
)
}
RENAME TO
#{
quote_table_name
(
new_seq
)
}
"
end
rename_table_indexes
(
table_name
,
new_name
)
end
# Adds a new column to the named table.
...
...
@@ -370,6 +372,7 @@ def change_column_null(table_name, column_name, null, default = nil)
def
rename_column
(
table_name
,
column_name
,
new_column_name
)
clear_cache!
execute
"ALTER TABLE
#{
quote_table_name
(
table_name
)
}
RENAME COLUMN
#{
quote_column_name
(
column_name
)
}
TO
#{
quote_column_name
(
new_column_name
)
}
"
rename_column_indexes
(
table_name
,
column_name
,
new_column_name
)
end
def
remove_index!
(
table_name
,
index_name
)
#:nodoc:
...
...
activerecord/lib/active_record/connection_adapters/sqlite3_adapter.rb
浏览文件 @
0916f88f
...
...
@@ -435,8 +435,9 @@ def remove_index!(table_name, index_name) #:nodoc:
#
# Example:
# rename_table('octopuses', 'octopi')
def
rename_table
(
name
,
new_name
)
exec_query
"ALTER TABLE
#{
quote_table_name
(
name
)
}
RENAME TO
#{
quote_table_name
(
new_name
)
}
"
def
rename_table
(
table_name
,
new_name
)
exec_query
"ALTER TABLE
#{
quote_table_name
(
table_name
)
}
RENAME TO
#{
quote_table_name
(
new_name
)
}
"
rename_table_indexes
(
table_name
,
new_name
)
end
# See: http://www.sqlite.org/lang_altertable.html
...
...
@@ -495,6 +496,7 @@ def rename_column(table_name, column_name, new_column_name) #:nodoc:
raise
ActiveRecord
::
ActiveRecordError
,
"Missing column
#{
table_name
}
.
#{
column_name
}
"
end
alter_table
(
table_name
,
:rename
=>
{
column_name
.
to_s
=>
new_column_name
.
to_s
})
rename_column_indexes
(
table_name
,
column_name
,
new_column_name
)
end
protected
...
...
activerecord/test/cases/migration/rename_column_test.rb
浏览文件 @
0916f88f
...
...
@@ -86,8 +86,29 @@ def test_rename_column_with_an_index
assert_equal
1
,
connection
.
indexes
(
'test_models'
).
size
rename_column
"test_models"
,
"hat_name"
,
"name"
# FIXME: should we rename the index if it's name was autogenerated by rails?
assert_equal
[
'index_test_models_on_hat_name'
],
connection
.
indexes
(
'test_models'
).
map
(
&
:name
)
assert_equal
[
'index_test_models_on_name'
],
connection
.
indexes
(
'test_models'
).
map
(
&
:name
)
end
def
test_rename_column_with_multi_column_index
add_column
"test_models"
,
:hat_size
,
:integer
add_column
"test_models"
,
:hat_style
,
:string
,
limit:
100
add_index
"test_models"
,
[
"hat_style"
,
"hat_size"
],
unique:
true
rename_column
"test_models"
,
"hat_size"
,
'size'
assert_equal
[
'index_test_models_on_hat_style_and_size'
],
connection
.
indexes
(
'test_models'
).
map
(
&
:name
)
rename_column
"test_models"
,
"hat_style"
,
'style'
assert_equal
[
'index_test_models_on_style_and_size'
],
connection
.
indexes
(
'test_models'
).
map
(
&
:name
)
end
def
test_rename_column_does_not_rename_custom_named_index
add_column
"test_models"
,
:hat_name
,
:string
add_index
:test_models
,
:hat_name
,
:name
=>
'idx_hat_name'
assert_equal
1
,
connection
.
indexes
(
'test_models'
).
size
rename_column
"test_models"
,
"hat_name"
,
"name"
assert_equal
[
'idx_hat_name'
],
connection
.
indexes
(
'test_models'
).
map
(
&
:name
)
end
def
test_remove_column_with_index
...
...
activerecord/test/cases/migration/rename_table_test.rb
浏览文件 @
0916f88f
...
...
@@ -63,7 +63,17 @@ def test_rename_table_with_an_index
connection
.
enable_identity_insert
(
"octopi"
,
false
)
if
current_adapter?
(
:SybaseAdapter
)
assert_equal
'http://www.foreverflying.com/octopus-black7.jpg'
,
connection
.
select_value
(
"SELECT url FROM octopi WHERE id=1"
)
assert
connection
.
indexes
(
:octopi
).
first
.
columns
.
include?
(
"url"
)
index
=
connection
.
indexes
(
:octopi
).
first
assert
index
.
columns
.
include?
(
"url"
)
assert_equal
'index_octopi_on_url'
,
index
.
name
end
def
test_rename_table_does_not_rename_custom_named_index
add_index
:test_models
,
:url
,
name:
'special_url_idx'
rename_table
:test_models
,
:octopi
assert_equal
[
'special_url_idx'
],
connection
.
indexes
(
:octopi
).
map
(
&
:name
)
end
def
test_rename_table_for_postgresql_should_also_rename_default_sequence
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录