Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Rails 6.0 part 1

y-yagi
May 21, 2019
3.5k

Rails 6.0 part 1

Ginza.rb 71

y-yagi

May 21, 2019
Tweet

Transcript

  1. 前回からのアップデート 前回からのアップデート Amazon SESのサポートが削除された [Remove the Amazon SES ingress] そもそもバグってて正しく動作してなかった

    修正が6.0に間に合わなくて為機能自体が削除された 6.1でサポート予定 https://github.com/rails/rails/pull/35972
  2. 設定ファイル例 設定ファイル例 development: primary: <<: *default database: db/my_primary_db.sqlite3 primary_replica: <<:

    *default database: db/my_primary_replica_db.sqlite3 replica: true animals: <<: *default database: db/animals.sqlite3 migrations_paths: "db/animals_migrate"
  3. MULTIPLE DB MULTIPLE DB connected_toで接続先を指定出来る 未指定の場合は設定ファイルで最初に定義された接続先 User.first # => `primary`

    DBにアクセス ActiveRecord::Base.connected_to(database: :animals) { Monkey.f # => `animals` DBにアクセス
  4. MULTIPLE DB MULTIPLE DB モデルで接続先を指定出来る class Monkey < ApplicationRecord connects_to

    database: { writing: :animals } end Monkey.first # => `animals` DBにアクセス
  5. MULTIPLE DB MULTIPLE DB class Monkey < ApplicationRecord connects_to database:

    { wr: :animals } end ActiveRecord::Base.connected_to(role: :wr) { Monkey.first }
  6. MULTIPLE DB MULTIPLE DB Railsはデフォルトで書き込み用のロールとしてwriting、読み込み 用のロールとしてreadingという名前を使用している ロール名は変更可能 このロール名は後で説明するRackミドルウェアで使用される ActiveRecord::Base.reading_role #

    => :reading ActiveRecord::Base.writing_role # => :writing ActiveRecord::Base.reading_role = :readonly ActiveRecord::Base.writing_role = :default ActiveRecord::Base.reading_role # => :default ActiveRecord::Base.writing_role # => :readonly
  7. MULTIPLE DB MULTIPLE DB config.active_record.database_selector = { delay: 2.seconds }

    config.active_record.database_resolver = ActiveRecord::Middlew config.active_record.database_resolver_context = ActiveRecord:
  8. RAKE TASK RAKE TASK 各種DB用のtask(db:create、db:migrate等)は処理を行いたい DB名を末尾に指定出来るようになっている DB名を指定しない場合全てのDBに対してtaskは実行される rails db:create #

    Creates the databas rails db:create:animals # Create animals data rails db:create:primary # Create primary data rails db:drop # Drops the database rails db:drop:animals # Drop animals databa rails db:drop:primary # Drop primary databa rails db:migrate # Migrate the databas rails db:migrate:animals # Migrate animals dat rails db:migrate:primary # Migrate primary dat
  9. MULTIPLE DB対応PR MULTIPLE DB対応PR 関連するPR Part 1 Easy Multi db

    in Rails: Add basic rake tasks for multi db setup Part 2: Multi-db improvements, Refactor Active Record con gurations Part 3: Multi-db Improvements, identifying replica con gurations Part 4: Multi db improvements, Basic API for connection switching Part 5: Multi db improvements, Fix query cache for multiple connections Part 6: Multi db improvements, Make connection handler per thread instead of per ber Part 7: Multi db improvements, Add ability to block writes to a database Part 8: Multi db improvements, Adds basic automatic database switching to Rails Add ability to change the names of the default handlers For xtures share the connection pool when there are multiple handlers
  10. PARALLEL TESTING PARALLEL TESTING class ActiveSupport::TestCase # Run tests in

    parallel with specified workers parallelize(workers: :number_of_processors, with: :processes end
  11. PARALLEL TESTING PARALLEL TESTING テストを実行するワーカの数はworkers引数で指定する number_of_processorsという値を指定した場合自動でマシンのコア数の値 を指定してくれる ワーカはプロセス / スレッドを選択可能

    プロセスの生成にはforkを使用する為、forkが使用出来ない環境ではスレッド を使用する必要がある プロセス間のデータの連携にはdRubyが使用されている
  12. PARALLEL TESTING PARALLEL TESTING Parallel Testingはがっつりminitestに依存している 元々minitestにParallel Testingのための機能がありそれを使用している minitest/hell ワーカにスレッドを使用した場合の実装はminitestの機能そのまま

    Railsではワーカにプロセスを使用した場合の実装が提供されている そのため、RSpecユーザがそのまま使用出来るような機能ではない Add support for Rails 6 built-in Parallel Testing( ) https://github.com/seattlerb/minitest/blob/master/lib/minitest/hell.rb https://github.com/rspec/rspec- rails/issues/2104
  13. ZEITWERK ZEITWERK 発音がしずらい新たなcode loader Zeitwerk: A new code loader for

    Ruby eager loadとかautoloadを良い感じにしてくれるやつ https://medium.com/@fxn/zeitwerk-a-new-code-loader-for-ruby- ae7895977e73 https://github.com/fxn/zeitwerk
  14. ZEITWERK ZEITWERK vs module Admin class UsersController < ApplicationController def

    index @users = User.all end end end class Admin::UsersController < ApplicationController def index @users = User.all end end
  15. ZEITWERK ZEITWERK Zeitwerkを使用したcode loaderの登場によりcode loaderが2 種類になった デフォルトでは元のcode loader(classic autoloaderと呼ばれて いる)

    Zeitwerkを使用するにはload_defaultsに6.0を指定する or con g.autoloaderに:zeitwerkを指定する ZeitwerkはJRuby未サポートらしく、JRubyの場合load_defaultsに6.0を指 定してもclassic autoloaderが使用される
  16. ZEITWERK ZEITWERK Ruby 2.5でiseq cache + TracePointの挙動があやしい Ruby 2.6では大丈夫 Ruby

    2.5でiseq cacheを活用しているライブラリとの相性があや しい ようはbootsnap bootsnapは1.4.4以上だとRuby 2.5でiseq cacheを無効化するよ うにしている Disable iseq cache in Ruby 2.5 https://github.com/Shopify/bootsnap/pull/257
  17. ZEITWERK ZEITWERK cache_classes = trueの場合reload処理は動作しない(エラーにな 元々con g/environments/test.rbではache_classes = trueだった だとSpringを使用している場合に問題がおきる

    Springがコードをreloadするが上記制限によりエラーになる テスト環境でSpringを使用している場合cache_classes = falseを指 要がある generate con g.cache_classes = false if Spring https://github.com/rails/rails/commit/65344f254cde87950c7f176cb7aa0