なるようになるブログ

読書感想文かrailsについてかrubyについてか

rails commit log流し読み(2014/06/27)

rails commit log流し読み(2014/06/27)

2014/06/27分のコミットです。

CHANGELOGにのったコミットは以下の通りです。

activerecord/CHANGELOG.md

activesupport/CHANGELOG.md

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_hashuuid_v3uuid_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:を追加しています。


Change method visibility

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名を指定出来ます。デフォルトはcontrolleractionが設定されています。

config.always_permitted_parameters = %w( controller action format )

こんな感じで。代わりにNEVER_UNPERMITTED_PARAMSはdeprateになりました。


Tiny follow-up to 1a69112

rails guideのActive Record Migrationsの修正です。

80文字を越えた行の調整、リスト化等を行っています。


credit Matthew Higgins for the integration of foreign keys. [ci skip]

activerecord/CHANGELOG.mdの修正です。

foreign key対応のCHANGELOGMatthew 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_mapArray#grepメソッドを使ってリファクタリングしています。


db:migrate:status refactoring: Rewrite hand-crafted SQL query with ActiveRecord#pluck

activerecord/lib/active_record/railties/databases.rakeの修正です。

SQLがハードコーディングされている箇所をpluckメソッドで書きなおしています。


Follow-up to #15215 [ci skip]

rails guideの修正です。

80文字を越えた行の調整、シングルクォートの追加等を行っています。