疑問
結論
add_index と同じオプションが使える
-> t.string :column_name, index: { unique: true }
と書ける
Railsのコード読んでみた
- 環境:Rails 5.1.1
create_table のブロック内部
-
前段
- ブロック引数は
class TableDefinition
のインスタンス。 -
t.string
t.integer
などはt.column(name, type, options = {})
のシンタックスシュガー - (
module ColumnMethods
あたりを参照)
- ブロック引数は
-
create_table のカラム追加メソッド
def column(name, type, options = {}) ... index_options = options.delete(:index) index(name, index_options.is_a?(Hash) ? index_options : {}) if index_options ... end
-
indexの定義
# Adds index options to the indexes hash, keyed by column name
# This is primarily used to track indexes that need to be created after the table
#
# index(:account_id, name: 'index_projects_on_account_id')
def index(column_name, options = {})
indexes << [column_name, options]
end
create_table メソッド
create_tableじゃない方法で作成する時と同じadd_index
を呼んでいる
def create_table(table_name, comment: nil, **options)
...
td.indexes.each do |column_name, index_options|
add_index(table_name, column_name, index_options)
end
end
つまり
add_index
で指定できるものはcreate_table
内でも使える!