Class: ActiveRecord::PLSQL::PipelinedRelation
- Inherits:
-
Relation
- Object
- Relation
- ActiveRecord::PLSQL::PipelinedRelation
- Defined in:
- lib/active_record/plsql/pipelined_relation.rb
Instance Attribute Summary collapse
-
#pipelined_arguments_values ⇒ Object
Returns the value of attribute pipelined_arguments_values.
Instance Method Summary collapse
- #bind_pipelined_arguments(values) ⇒ Object
-
#bind_values=(vals) ⇒ Object
Safe arguments binding.
- #exec_queries ⇒ Object
- #merge_pipelined_arguments(pos, values) ⇒ Object
- #pipelined_arguments_binds_pos(binds = @bind_values) ⇒ Object
- #where(opts, *rest) ⇒ Object
Instance Attribute Details
#pipelined_arguments_values ⇒ Object
Returns the value of attribute pipelined_arguments_values.
3 4 5 |
# File 'lib/active_record/plsql/pipelined_relation.rb', line 3 def pipelined_arguments_values @pipelined_arguments_values end |
Instance Method Details
#bind_pipelined_arguments(values) ⇒ Object
20 21 22 23 24 25 26 27 28 29 |
# File 'lib/active_record/plsql/pipelined_relation.rb', line 20 def bind_pipelined_arguments(values) relation = clone if values.is_a?(Hash) arguments_values = values.values_at(*pipelined_arguments_names.map(&:to_sym)) relation.bind_values += pipelined_arguments.zip(arguments_values) else relation.where_values += values end relation end |
#bind_values=(vals) ⇒ Object
Safe arguments binding
52 53 54 55 56 57 58 59 60 |
# File 'lib/active_record/plsql/pipelined_relation.rb', line 52 def bind_values=(vals) if @klass.pipelined? && (pos = pipelined_arguments_binds_pos) vals = vals.map(&:dup) merge_pipelined_arguments(pos, vals) super(vals) else super end end |
#exec_queries ⇒ Object
62 63 64 65 66 67 68 69 70 71 72 73 |
# File 'lib/active_record/plsql/pipelined_relation.rb', line 62 def exec_queries return super unless @klass.pipelined? && pipelined_arguments.any? return @records if loaded? super return @records if @records.empty? pos = pipelined_arguments_binds_pos found_by_arguments = @bind_values[pos...(pos + pipelined_arguments.size)] # save arguments for easy reloading @records.each {|record| record.found_by_arguments = found_by_arguments} @records end |
#merge_pipelined_arguments(pos, values) ⇒ Object
31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
# File 'lib/active_record/plsql/pipelined_relation.rb', line 31 def merge_pipelined_arguments(pos, values) new_values_pos = pos + pipelined_arguments.size exist_args = values[pos...new_values_pos] new_values = values[new_values_pos..-1] new_args_pos = pipelined_arguments_binds_pos(new_values) # return if there are no new argument values return unless new_args_pos new_arguments = new_values[new_args_pos...(new_args_pos + pipelined_arguments.size)] # overriding nil arguments new_arguments.each_with_index {|val, idx| exist_args[idx][1] ||= val[1]} # exclude new arguments values[(new_values_pos + new_args_pos)...(new_values_pos + new_args_pos + pipelined_arguments.size)] = nil # drop nil values.compact! end |
#pipelined_arguments_binds_pos(binds = @bind_values) ⇒ Object
47 48 49 |
# File 'lib/active_record/plsql/pipelined_relation.rb', line 47 def pipelined_arguments_binds_pos(binds = @bind_values) binds.index {|(col,_)| col.name == pipelined_arguments.first.name} end |
#where(opts, *rest) ⇒ Object
5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
# File 'lib/active_record/plsql/pipelined_relation.rb', line 5 def where(opts, *rest) return super unless @klass.pipelined? && pipelined_arguments.any? pipelined_args = pipelined_arguments_names.map(&:to_sym) opts = normalize_arguments_conditions(opts, pipelined_args) return super if opts.blank? relation = bind_pipelined_arguments(opts) opts.reject! {|k| pipelined_args.include?(k)} # bind rest of arguments relation.where_values += build_where(opts, rest) relation end |