週刊Railsウォッチ(20180216)Rails 5.1.5リリース、DHHのYouTubeチャンネルは必見、Ruby Toolboxが運営再開ほか

こんにちは、hachi8833です。先週はつっつき会が時間オーバーしてしまいましたが、今週は何とか収まりました。 臨時ニュース Rails 5.1.5リリース プレスリリース: Rails 5.1.5 has been released | Riding Rails weblog.rubyonrails.orgより マイナーリリースなのでバグ修正/セキュリティ対応が中心です。 ウォッチの社内つっつきを始めた直後にtakanekoさんに教えてもらうまでリリースに気づいてませんでした。ありがとうございます。 変更があったChangelogだけリストアップします。 ActionMailer: 1件 ActionPack: 2件 ActiveJob: 1件 ActiveModel: 1件 ActiveRecord: 10件 Railties: 1件 Rails: 今週の改修 5-2-stableが頻繁かつ細かく更新されていて、リリースが迫っていることを感じます。 以下はRails 6.0.0.alphaであるmasterから見繕いました。 新メソッド: Relation#pick PR: #31941 Add Relation#pick as short-hand for single-value plucks DHH自らのコミットです。 現在のリレーションでその名前付きカラムの最初の値をpickする。relation.limit(1).pluck(column_name).firstのショートハンドであり、リレーションが既に1行まで絞り込まれているときに主に有用。 #pluckと同様、#pickもレコードオブジェクト全体ではなく実際の値だけを読み込むので、こちらも効率がよくなる。値がそのカラム型にキャストされる点もpluckと同様。 # PRより Person.where(id: 1).pick(:name) # SELECT people.name FROM people WHERE id = 1 LIMIT 1 # => ‘David’ # activerecord/lib/active_record/relation/calculations.rb#L217 + def pick(*column_names) + limit(1).pluck(*column_names).first + end つっつきボイス: 「pluckってlazyじゃないんだっけ?」「じゃないですね」「あー、だからこれが欲しかったのか: 気持ちはワカル」 新メソッド: #create_or_find_by PR: #31989 Add #create_or_find_by to lean on unique constraints こちらもDHH。#find_or_create_byと違い、DBのunique制約が効くそうです。 # activerecord/lib/active_record/relation.rb#L188 + def create_or_find_by(attributes, &block) + transaction(requires_new: true) { create(attributes, &block) } + rescue ActiveRecord::RecordNotUnique + find_by!(attributes) + end + + # Like #create_or_find_by, but calls + # {create!}[rdoc-ref:Persistence::ClassMethods#create!] so an exception + # is raised if the created record is invalid. + def create_or_find_by!(attributes, &block) + transaction(requires_new: true) { create!(attributes, &block) } + rescue ActiveRecord::RecordNotUnique + find_by!(attributes) + end つっつきボイス: 「#find_or_create_byじゃなくて#create_or_find_by…だと?」「unique制約ではじきながらcreateして、できなければfindする、みたいな流れか」「それにしても名前が紛らわしい…タイポかとおもた」「コードレビューで『これ間違いじゃ?』とか言われそうな予感」「#create_or_find_byはテーブルをロックするから安全な分状況によってはパフォーマンス落ちそうだなー」「登場して間もないし、Rails6向けだろうから、まだまだ議論されそうですね」 concernインクルード時のクラス名衝突を回避 PR: #31968 ActiveStorage: use full class names when including concerns to avoid collisions # activestorage/app/models/active_storage/blob.rb class ActiveStorage::Blob < ActiveRecord::Base – include Analyzable, Identifiable, Representable + include … Continue reading 週刊Railsウォッチ(20180216)Rails 5.1.5リリース、DHHのYouTubeチャンネルは必見、Ruby Toolboxが運営再開ほか