Sha256: 174157f58a9461fb305a4b4858690cb4e458712da1512392d0d54ab9ac4b6a65

Contents?: true

Size: 1.38 KB

Versions: 1

Compression:

Stored size: 1.38 KB

Contents

require "rails_or/version"
require 'rails'
require 'active_record'

class ActiveRecord::Relation
  if method_defined?(:or)
    alias rails5_or or
    def or(*other)
      return rails5_or(parse_or_parameter(*other))
    end
  else
    def or(*other)
      other        = parse_or_parameter(*other)
      combining    = group_values.any? ? :having : :where
      left_values  = send("#{combining}_values")
      right_values = other.send("#{combining}_values")
      common       = left_values & right_values
      mine         = left_values - common
      theirs       = right_values - common
      if mine.any? && theirs.any?
        mine.map!{|x| String === x ? Arel.sql(x) : x }
        theirs.map!{ |x| String === x ? Arel.sql(x) : x }
        mine = [Arel::Nodes::And.new(mine)] if mine.size > 1
        theirs = [Arel::Nodes::And.new(theirs)] if theirs.size > 1
        common << Arel::Nodes::Or.new(mine.first, theirs.first)
      end
      send("#{combining}_values=", common)
      self.bind_values = self.bind_values + other.bind_values
      return self  
    end
  end
private
  def parse_or_parameter(*other)
    other = other.first if other.size == 1
    case other
    when Hash   ; klass.where(other)
    when Array  ; klass.where(other)
    when String ; klass.where(other)
    else        ; other
    end
  end
end
class ActiveRecord::Base
  def self.or(*args)
    self.where('').or(*args)
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
rails_or-1.0.1 lib/rails_or.rb