Sha256: c8298f632b7c975d18c4b83e21ed3595bbdec36ee7eac7050ade2be976b285bf

Contents?: true

Size: 740 Bytes

Versions: 100

Compression:

Stored size: 740 Bytes

Contents

# frozen_string_literal: true

require "attr_extras"

module SQL
  # Example:
  #
  #     indexed_case_stmt(:code, "DT", "AC", "XY")
  #
  # Will return the string:
  #
  #    CASE code
  #       WHEN 'DT' THEN 1
  #       WHEN 'AC' THEN 2
  #    END
  #
  # Used for creating an explicit sort order in conjunction with a find:
  #
  #    Description.where(code: codes).order(indexed_case_stmt(:code, codes))
  #
  class IndexedCaseStmt
    pattr_initialize :column, :items

    def generate
      return if items.blank?

      clauses = []
      Array(items).each_with_index do |item, index|
        clauses << Arel.sql("WHEN '#{item}' THEN #{index}")
      end

      Arel.sql("CASE #{column} #{clauses.join(' ')} END")
    end
  end
end

Version data entries

100 entries across 100 versions & 1 rubygems

Version Path
renalware-core-2.0.159 lib/sql/indexed_case_stmt.rb
renalware-core-2.0.158 lib/sql/indexed_case_stmt.rb
renalware-core-2.0.157 lib/sql/indexed_case_stmt.rb
renalware-core-2.0.156 lib/sql/indexed_case_stmt.rb
renalware-core-2.0.155 lib/sql/indexed_case_stmt.rb
renalware-core-2.0.153 lib/sql/indexed_case_stmt.rb
renalware-core-2.0.152 lib/sql/indexed_case_stmt.rb
renalware-core-2.0.151 lib/sql/indexed_case_stmt.rb
renalware-core-2.0.149 lib/sql/indexed_case_stmt.rb
renalware-core-2.0.148 lib/sql/indexed_case_stmt.rb
renalware-core-2.0.147 lib/sql/indexed_case_stmt.rb
renalware-core-2.0.146 lib/sql/indexed_case_stmt.rb
renalware-core-2.0.145 lib/sql/indexed_case_stmt.rb
renalware-core-2.0.144 lib/sql/indexed_case_stmt.rb
renalware-core-2.0.143 lib/sql/indexed_case_stmt.rb
renalware-core-2.0.142 lib/sql/indexed_case_stmt.rb
renalware-core-2.0.141 lib/sql/indexed_case_stmt.rb
renalware-core-2.0.140 lib/sql/indexed_case_stmt.rb
renalware-core-2.0.139 lib/sql/indexed_case_stmt.rb
renalware-core-2.0.138 lib/sql/indexed_case_stmt.rb