OCIError: ORA-01795: maximum number of expressions in a list is 1000, seconda puntata

Se vogliamo che che quando facciamo un where(:id => [array_moooolto_grande]) non esploda tutto con Oracle (per il simpatico errore del titolo), possiamo pensare di fare un "porcata":

module Porcata
  CHUNK_SIZE = 2
  def in(other)
    if other.is_a?(Array) && other.size > CHUNK_SIZE
      result = nil
      0.step(other.size, CHUNK_SIZE).each do |step|
        if other[step, CHUNK_SIZE].size > 0 #per evitare l'ultimo vuoto nel caso di giusti CHUNK_SIZE*x pezzi
          tmp = Arel::Nodes::In.new self, other[step, CHUNK_SIZE]
          if result
            result = Arel::Nodes::Or.new result, tmp
          else
            result = tmp
          end
        end
      end
      result
    else
      super other
    end
  end
end

Arel::Attributes::Attribute.send(:include, Porcata)

puts Modello.where(:id => [1,2,3,4,5,5,6,7,8,9,3,3,4,5,4]).to_sql

In verità non è una porcata, ma uno dei sistemi più eleganti per fare un overload proprio sul pezzettino che serve....
I pomeriggi così sono ben spesi...

Categories

Other Posts

RSS Feed

Subscribe

Archives