Module: FindWithOrder::PGSupport
- Defined in:
- lib/find_with_order/pg_support.rb
Class Method Summary collapse
- .find_with_order(relation, ids) ⇒ Object
- .where_with_order(relation, column, ids) ⇒ Object
- .with_order(relation, column, ids, null_first: false) ⇒ Object
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 |