Module: ActiveRecord::QueryMethods

Defined in:
lib/postgres_ext/active_record/relation/query_methods.rb

Defined Under Namespace

Classes: WhereChain

Instance Method Summary collapse

Instance Method Details

#build_arel_with_extensionsObject



102
103
104
105
106
107
108
109
110
# File 'lib/postgres_ext/active_record/relation/query_methods.rb', line 102

def build_arel_with_extensions
  arel = build_arel_without_extensions

  build_with(arel, with_values)

  build_rank(arel, rank_values)

  arel
end

#build_rank(arel, ranks) ⇒ Object



132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
# File 'lib/postgres_ext/active_record/relation/query_methods.rb', line 132

def build_rank(arel, ranks)
  rank_orders = ranks.uniq.reject(&:blank?).flat_map do |value|
    case value
    when :order
      arel.orders
    when Symbol
      table[value].asc
    when Hash
      value.map { |field, dir| table[field].send(dir) }
    else
      Arel::Nodes::SqlLiteral.new value
    end
  end

  unless rank_orders.blank?
    rank_node = Arel::Nodes::SqlLiteral.new 'rank()'
    window = Arel::Nodes::Window.new.order(rank_orders)
    over_node = Arel::Nodes::Over.new rank_node, window

    arel.project(over_node)
  end
end

#build_with(arel, withs) ⇒ Object



112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
# File 'lib/postgres_ext/active_record/relation/query_methods.rb', line 112

def build_with(arel, withs)
  with_statements = withs.flat_map do |with_value|
    case with_value
    when String
      with_value
    when Hash
      with_value.map  do |name, expression|
        case expression
        when String
          select = Arel::SqlLiteral.new "(#{expression})"
        when ActiveRecord::Relation
          select = Arel::SqlLiteral.new "(#{expression.to_sql})"
        end
        as = Arel::Nodes::As.new Arel::SqlLiteral.new(name.to_s), select
      end
    end
  end
  arel.with with_statements unless with_statements.empty?
end

#ranked(options = :order) ⇒ Object



93
94
95
# File 'lib/postgres_ext/active_record/relation/query_methods.rb', line 93

def ranked(options = :order)
  spawn.ranked! options
end

#ranked!(*args) ⇒ Object



97
98
99
100
# File 'lib/postgres_ext/active_record/relation/query_methods.rb', line 97

def ranked!(*args)
  self.rank_values += args
  self
end

#with(*args) ⇒ Object



83
84
85
86
# File 'lib/postgres_ext/active_record/relation/query_methods.rb', line 83

def with(*args)
  check_if_method_has_arguments!('with', args)
  spawn.with!(*args.compact.flatten)
end

#with!(*args) ⇒ Object



88
89
90
91
# File 'lib/postgres_ext/active_record/relation/query_methods.rb', line 88

def with!(*args)
  self.with_values += args
  self
end