rails commit log流し読み(2014/06/27)
2014/06/27分のコミットです。
CHANGELOGにのったコミットは以下の通りです。
rails 4.2のbig featureの一つ(らしい)であるforeign keysの対応がマージされています。
Move writing unknown column exception to null attribute
データ保存時に存在しないカラムがあった場合のエラーのraise処理をAttributeクラスに移動しています。
また、合わせてmodelにprimary keyが無いときの微妙なバグをfixしているとの事です。
:nodoc: our SecureRandom patches [ci skip]
activesupport/lib/active_support/core_ext/securerandom.rbの修正です。
uuid_from_hash、uuid_v3、uuid_v5メソッドに:nodoc:を追加しています。
上記メソッドの値はSecureRandomではなく、Digestにあるべきとの事で、一時的に:nodoc:を追加しているようです。
コミットログに"Pull request welcomed!"の文字が。
Merge pull request #15606 from senny/ar/foreign_key_support https://github.com/rails/rails/commit/ea93a15316d93896227c4c9d1ec5e47469575453
ActiveRecordにforeign keys対応が追加されました。
マイグレーションファイルに以下の内容を記載する事で設定可能です。
# 追加 add_foreign_key :articles, :authors # 削除 remove_foreign_key :articles, :authors
add_foreign_keyの場合、生成されるSQLは以下のような感じです。
ALTER TABLE "articles" ADD CONSTRAINT articles_author_id_fk FOREIGN KEY ("author_id") REFERENCES "authors" ("id")
外部キー成約をALTERしているだけですね。カラムの追加等は行わないので、外部キー用のカラムは当然事前に作成しておく必要があります。
外部キー用のカラムはadd_foreign_keyのオプションで設定可能です。その他設定可能なオプションは以下の通りです。
:column: 外部キーを設定するカラム名。デフォルトはto_table.singularize + "_id":primary_key: 主キーのカラム名。デフォルトはid.:name: 成約名。デフォルトはfk_rails_<identifier>:on_delete:ON DELETE実行時のアクション. 設定可能な値は、:nullify,:cascade:と:restrict:on_update:ON UPDATE実行時のアクション. 設定可能な値は、:nullify,:cascade:と:restrict
外部キーを設定している状態で、対象をdeleteしようとすると、ActiveRecord::InvalidForeignKeyがraiseされるようです。(:on_deleteの設定に依存するところか)
# 実行例 PG::ForeignKeyViolation: ERROR: update or delete on table "authors" violates foreign key constraint "fk_rails_3104920b38" on table "articles" DETAIL: Key (id)=(2) is still referenced from table "articles". : DELETE FROM "authors" WHERE "authors"."id" = $1 ActiveRecord::InvalidForeignKey: PG::ForeignKeyViolation: ERROR: update or delete on table "authors" violates foreign key constraint "fk_rails_3104920b38" on table "articles" DETAIL: Key (id)=(2) is still referenced from table "articles". : DELETE FROM "authors" WHERE "authors"."id" = $1
なお、今の所Mysql2Adapter、MysqlAdapter、PostgreSQLAdapterだけ対応との事です。あれ、オラクル…。
Add nodoc to internal class [ci skip]
activerecord/lib/active_record/connection_adapters/abstract/schema_definitions.rbの修正です。
ForeignKeyDefinitionクラスに:nodoc:を追加しています。
activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rbの修正です。
内部メソッドをprivateに移動しています。
Merge pull request #14247 from robin850/inflections-with-uncountables
activesupport/lib/active_support/inflector/inflections.rbの修正です。
uncountableメソッドで@uncountablesに値を追加するときにdowncaseメソッドを呼び出すよう修正しています。
apply_inflectionsメソッドでuncountableのチェックをする際、大文字小文字をチェックしない済むようになり、性能改善になっているとの事です。
Add always_permitted_parameters as an option.
actionpack/lib/action_controller/metal/strong_parameters.rbの修正です。
StrongParameterにalways_permitted_parametersにが追加されました。名前の通りで、UnpermittedParameters発生させないparam名を指定出来ます。デフォルトはcontroller、actionが設定されています。
config.always_permitted_parameters = %w( controller action format )
こんな感じで。代わりにNEVER_UNPERMITTED_PARAMSはdeprateになりました。
rails guideのActive Record Migrationsの修正です。
80文字を越えた行の調整、リスト化等を行っています。
credit Matthew Higgins for the integration of foreign keys. [ci skip]
activerecord/CHANGELOG.mdの修正です。
foreign key対応のCHANGELOGにMatthew Higginsのクレジットを追加しています。
Simplify complex code in databases.rake
activerecord/lib/active_record/railties/databases.rakeの修正です。
fixturesのpathの参照方法を修正しています。
- File.join [Rails.root, ENV['FIXTURES_PATH'] || %w{test fixtures}].flatten + Rails.root.join(ENV['FIXTURES_PATH'])
db:fixtures:{identify,load} tasks respect AR::Tasks::DatabaseTasks.root
activerecord/lib/active_record/railties/databases.rakeの修正です。
先ほど修正したfixturesのpathの参照方法を再度修正しています。
- Rails.root.join(ENV['FIXTURES_PATH']) + ActiveRecord::Tasks::DatabaseTasks.root.join(ENV['FIXTURES_PATH'])
Get rid of duplication in db:fixtures:{identify,load}
activerecord/lib/active_record/railties/databases.rakeの修正です。
重複している処理を削除しています。
Replace a bit of cryptic code in fixtures:load rake task with plain stupid Ruby
activerecord/lib/active_record/railties/databases.rakeの修正です。
fixtures_dir変数の設定処理を微修正しています。
Extract fixture_files variable in fixtures:load rake task
activerecord/lib/active_record/railties/databases.rakeの修正です。
fixture_filesのループ処理をリファクタリングしています。
db:fixtures:load refactoring: remove unnecessary loop
activerecord/lib/active_record/railties/databases.rakeの修正です。
不要なループ処理を削除しています。
Replace String index juggling with Pathname goodness in db:fixtures:load
activerecord/lib/active_record/railties/databases.rakeの修正です。
fixtureファイルの拡張子の削除処理をサイズでやっていたのを、Pathname#sub_extメソッドを使用するよう修正しています。
Add explaining variables to db:migrate:status
activerecord/lib/active_record/railties/databases.rakeの修正です。
配列の値を参照していたのを、ループ内変数を定義するよう修正しています。
Use Array#flat_map and Array#grep in db:migrate:status task
activerecord/lib/active_record/railties/databases.rakeの修正です。
migration fileの検索処理をArray#flat_mapとArray#grepメソッドを使ってリファクタリングしています。
db:migrate:status refactoring: Rewrite hand-crafted SQL query with ActiveRecord#pluck
activerecord/lib/active_record/railties/databases.rakeの修正です。
SQLがハードコーディングされている箇所をpluckメソッドで書きなおしています。
各rails guideの修正です。
80文字を越えた行の調整、シングルクォートの追加等を行っています。