なるようになるブログ

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

rails commit log流し読み(2016/04/14)

2016/04/14分のコミットです。

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

activerecord/CHANGELOG.md


Add ruby 2.2.2+ version requirement for Rails 5 apps

rails guideのA Guide for Upgrading Ruby on Railsの修正です。

Ruby 2.2.2+の項に、Rails 5.0はRuby 2.2.2以降のみサポートする旨説明を追加しています。


Properly serialize all JSON primitives in the AR JSON type

activerecord/lib/active_record/type/internal/abstract_json.rbの修正です。

ActiveRecord::Type::Internal::AbstractJson#serializeメソッドで、引数がArray or Hashの場合のみActiveSupport::JSON.encodeを行うようにしていたのを、型を問わずActiveSupport::JSON.encodeを行うよ修正しています。

        def serialize(value)
-          if value.is_a?(::Array) || value.is_a?(::Hash)
-            ::ActiveSupport::JSON.encode(value)
-          else
-            value
-          end
+          ::ActiveSupport::JSON.encode(value)
        end

元の実装だと、Array、Hash以外のprimitiveな型(String, boolean等)をjson型のattributeに指定出来ない、という問題があった為対応したとの事です。


Merge pull request #24519 from bogdan/diry-keyword-args

activemodel/lib/active_model/dirty.rbの修正です。

#attribute_changed?の引数の指定に、キーワード引数を使用するよう修正しています。


Fixed bug introduced in #24519. Makes build green again

activemodel/lib/active_model/dirty.rbの修正です。

先ほどの#attribute_changed?の引数の指定にキーワード引数を使用するよう修正した対応で、#changes_include?メソッドの呼び出し結果の値をbooleanにする処理を誤って削除してしまっていたのを、戻しています。


Update ActionMailer base documentation [ci skip]

actionmailer/lib/action_mailer/base.rbのdocの修正です。

ActionMailer::Baseクラスのdocのグラマーの修正を行っています。


Merge pull request #24533 from vipulnsward/nodoc-version

activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rbのdocの修正です。

ActiveRecord::ConnectionAdapters::AbstractMysqlAdapter#versionメソッド:nodoc:を追加しています。内部向けAPIの為。


Include running mariadb on travis

.travis.yml、Active Recordの修正です。

travis ciでテストを行うmatrixに、Mariadbを使用するケースを追加しています。

Basecamp 3ではMariaDBを使用しており、Railsとして正式にMariadbをサポートする為、との事です。

が、time型にprecisionを指定した場合のテストで問題がおきており、一旦skipが追加されています。後ほど対応されています。


[ci skip] Remove extra so from the Action Pack CHANGELOG

actionpack/CHANGELOG.mdの修正です。

各entryのグラマーの修正を行っています。


Add quoted_time for truncating the date part of a time column value

activerecord/lib/active_record/connection_adapters/abstract/quoting.rbactiverecord/lib/active_record/type/time.rbの修正です。

time型の値のquote処理で、日付部分を削除するよう修正しています。

MySQLと異なり、MariaDBではtime型に日付が含まれた文字列を指定した場合、日付部分が無視されない為、MySQL / MariaDBで同じ挙動になるようにする為に対応したようです。

PRより。

-- MySQL

root@localhost [test] > CREATE TABLE `foos` (`id` int AUTO_INCREMENT PRIMARY KEY, `start` time(0), `finish` time(4)) ENGINE=InnoDB;
Query OK, 0 rows affected (0.04 sec)

root@localhost [test] > INSERT INTO `foos` (`start`, `finish`) VALUES ('2000-01-01 12:30:00', '2000-01-01 12:30:00.999900');
Query OK, 1 row affected, 2 warnings (0.02 sec)

Note (Code 1292): Incorrect time value: '2000-01-01 12:30:00' for column 'start' at row 1
Note (Code 1292): Incorrect time value: '2000-01-01 12:30:00.999900' for column 'finish' at row 1
root@localhost [test] > SELECT `foos`.* FROM `foos`;
+----+----------+---------------+
| id | start    | finish        |
+----+----------+---------------+
|  1 | 12:30:00 | 12:30:00.9999 |
+----+----------+---------------+
1 row in set (0.00 sec)

root@localhost [test] > SELECT  `foos`.* FROM `foos` WHERE `foos`.`start` = '2000-01-01 12:30:00' LIMIT 1;
+----+----------+---------------+
| id | start    | finish        |
+----+----------+---------------+
|  1 | 12:30:00 | 12:30:00.9999 |
+----+----------+---------------+
1 row in set, 1 warning (0.01 sec)

Note (Code 1292): Incorrect time value: '2000-01-01 12:30:00' for column 'start' at row 1
-- MariaDB

root@localhost [test] > CREATE TABLE `foos` (`id` int AUTO_INCREMENT PRIMARY KEY, `start` time(0), `finish` time(4)) ENGINE=InnoDB;
Query OK, 0 rows affected (0.02 sec)

root@localhost [test] > INSERT INTO `foos` (`start`, `finish`) VALUES ('2000-01-01 12:30:00', '2000-01-01 12:30:00.999900');
Query OK, 1 row affected, 2 warnings (0.00 sec)

Note (Code 1265): Data truncated for column 'start' at row 1
Note (Code 1265): Data truncated for column 'finish' at row 1
root@localhost [test] > SELECT `foos`.* FROM `foos`;
+----+----------+---------------+
| id | start    | finish        |
+----+----------+---------------+
|  1 | 12:30:00 | 12:30:00.9999 |
+----+----------+---------------+
1 row in set (0.00 sec)

root@localhost [test] > SELECT  `foos`.* FROM `foos` WHERE `foos`.`start` = '2000-01-01 12:30:00' LIMIT 1;
Empty set (0.00 sec)
-- ここがMySQLと異なり結果が空になってしまう

root@localhost [test] > SELECT  `foos`.* FROM `foos` WHERE `foos`.`start` = '12:30:00' LIMIT 1;
+----+----------+---------------+
| id | start    | finish        |
+----+----------+---------------+
|  1 | 12:30:00 | 12:30:00.9999 |
+----+----------+---------------+
1 row in set (0.00 sec)

MariaDBMySQLと微妙に挙動の違いがあるんですねえ。


MariaDB Documentation

rails guideの修正です。

各guide内のMySQLについて説明している箇所に、MariaDBについての説明も追加しています。

先のコミットでも書いた通り、Basecamp 3ではMariaDBを使用しており、Railsとして正式にMariadbをサポートする為。