Sha256: f4a75ee23c0d8b0248096541ea184f360be00656543c3cb0c62ed881357847cc

Contents?: true

Size: 986 Bytes

Versions: 2

Compression:

Stored size: 986 Bytes

Contents

# frozen_string_literal: true

require "active_record/relation"

module Heya
  module ActiveRecordRelationExtension
    TABLE_REGEXP = /heya_steps/

    def build_arel(aliases)
      arel = super(aliases)

      if table_name == "heya_campaign_memberships" && arel.to_sql =~ TABLE_REGEXP
        # https://www.postgresql.org/docs/9.4/queries-values.html
        values = Heya
          .campaigns.reduce([]) { |steps, campaign| steps | campaign.steps }
          .map { |step|
            ActiveRecord::Base.sanitize_sql_array(
              ["(?, ?)", step.gid, step.wait.to_i]
            )
          }

        if values.any?
          arel.with(
            Arel::Nodes::As.new(
              Arel::Table.new(:heya_steps),
              Arel::Nodes::SqlLiteral.new("(SELECT * FROM (VALUES #{values.join(", ")}) AS heya_steps (gid,wait))")
            )
          )
        end
      end

      arel
    end
  end

  ActiveRecord::Relation.prepend(ActiveRecordRelationExtension)
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
heya-0.5.0 lib/heya/active_record_extension.rb
heya-0.4.0 lib/heya/active_record_extension.rb