Method: ActiveRecord::ConnectionAdapters::PostgreSQLAdapter#distinct

Defined in:
lib/active_record/connection_adapters/postgresql_adapter.rb

#distinct(columns, order_by) ⇒ Object

Returns a SELECT DISTINCT clause for a given set of columns and a given ORDER BY clause.

PostgreSQL requires the ORDER BY columns in the select list for distinct queries, and requires that the ORDER BY include the distinct column.

distinct("posts.id", "posts.created_at desc")


873
874
875
876
877
878
879
880
881
882
883
884
885
886
# File 'lib/active_record/connection_adapters/postgresql_adapter.rb', line 873

def distinct(columns, order_by) #:nodoc:
  return "DISTINCT #{columns}" if order_by.blank?

  # Construct a clean list of column names from the ORDER BY clause, removing
  # any ASC/DESC modifiers
  order_columns = order_by.split(',').collect { |s| s.split.first }
  order_columns.delete_if { |c| c.blank? }
  order_columns = order_columns.zip((0...order_columns.size).to_a).map { |s,i| "#{s} AS alias_#{i}" }

  # Return a DISTINCT ON() clause that's distinct on the columns we want but includes
  # all the required columns for the ORDER BY to work properly.
  sql = "DISTINCT ON (#{columns}) #{columns}, "
  sql << order_columns * ', '
end