2017/07/31分のコミットです。
CHANGELOGにのったコミットは以下の通りです。
Merge pull request #29950 from MaxLap/avoid_or_clause_duplicates
activerecord/lib/active_record/relation/where_clause.rb
の修正です。
or
メソッドで、OR句から共通条件を抽出して、不要なOR句を削減出来るよう修正しています。
例。
class Project < ApplicationRecord scope :big, -> { where(big1: true).or(where(big2: true)) } scope :important, -> { where(important1: true).or(where(important2: true)) } end
上記のようなscopeがあった場合、結果が下記のように変わります。
# before Project.big.important # => Project Load (0.2ms) SELECT "projects".* FROM "projects" WHERE (("projects"."big1" = ? OR "projects"."big2" = ?) AND "projects"."important1" = ? OR ("projects"."big1" = ? OR "projects"."big2" = ?) AND "projects"."important2" = ?) LIMIT ? [["big1", 1], ["big2", 1], ["important1", 1], ["big1", 1], ["big2", 1], ["important2", 1], ["LIMIT", 11]] # after Project.big.important # => Project Load (0.5ms) SELECT "projects".* FROM "projects" WHERE ("projects"."big1" = ? OR "projects"."big2" = ?) AND ("projects"."important1" = ? OR "projects"."important2" = ?) LIMIT ? [["big1", 1], ["big2", 1], ["important1", 1], ["important2", 1], ["LIMIT", 11]]