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文字を越えた行の調整、シングルクォートの追加等を行っています。