Module: FindWithOrder::PGSupport

Defined in:
lib/find_with_order/pg_support.rb

Class Method Summary collapse

Class Method Details

.find_with_order(relation, ids) ⇒ Object



5
6
7
8
9
10
11
12
# File 'lib/find_with_order/pg_support.rb', line 5

def find_with_order(relation, ids)
  # return relation.where(id: ids).order("array_position(ARRAY[#{ids.join(',')}], #{relation.table_name}.id)").to_a #array_position is only support in PG >= 9.5

  id_val = uuid?(relation, 'id') ? '(id.val)::uuid' : 'id.val'
  values = to_sql_values(ids)
  return relation.where(id: ids)
                 .joins("JOIN (SELECT id.val, row_number() over() FROM (VALUES(#{values})) AS id(val)) AS id ON (#{relation.table_name}.id = #{id_val})")
                 .order('row_number')
end

.where_with_order(relation, column, ids) ⇒ Object



14
15
16
# File 'lib/find_with_order/pg_support.rb', line 14

def where_with_order(relation, column, ids)
  with_order(relation.where(column => ids), column, ids)
end

.with_order(relation, column, ids, null_first: false) ⇒ Object



18
19
20
21
22
23
24
25
26
27
28
29
# File 'lib/find_with_order/pg_support.rb', line 18

def with_order(relation, column, ids, null_first: false)
  id_val = uuid?(relation, column) ? '(id.val)::uuid' : 'id.val'
  if column.is_a?(Symbol) and relation.column_names.include?(column.to_s)
    column = "#{relation.connection.quote_table_name(relation.table_name)}.#{relation.connection.quote_column_name(column)}"
  else
    column = column.to_s
  end
  ids = ids.reverse if null_first
  values = to_sql_values(ids)
  return relation.joins("LEFT JOIN (SELECT id.val, row_number() over() FROM (VALUES(#{values})) AS id(val)) AS id ON (#{column} = #{id_val})")
                 .order(null_first ? 'row_number DESC' : 'row_number')
end