Skip to content

Suggest add update_all and destroy_all methods #461

@vincar

Description

@vincar

I love active_record in ruby, and I extend it like this

class Granite::Query::Builder(Model)
  private getter adapter : Granite::Adapter::Base = Model.adapter

  def update_all(**attributes)
    return if attributes.empty?

    assemble = self.assembler

    params = attributes.map do |key, value|
      "#{quote(key.to_s)}=#{assemble.add_parameter(value)}"
    end

    where = assemble.where
    args = assemble.numbered_parameters

    sql = "UPDATE #{quoted_table_name} SET #{params.join(", ")} #{where}"    

    elapsed_time = Time.measure do
      adapter.open &.exec(sql, args: args)
    end

    adapter.log(sql, elapsed_time, args)
  end

  def destroy_all
    assemble = self.assembler
    where = assemble.where
    args = assemble.numbered_parameters

    sql = "DELETE FROM #{quoted_table_name} #{where}"

    elapsed_time = Time.measure do
      adapter.open &.exec(sql, args: args)
    end

    adapter.log(sql, elapsed_time, args)
  end

  private def quote(term : String)
    adapter.quote(term)
  end

  private def quoted_table_name
    quote(assembler.table_name.to_s)
  end
end

module Granite::Querying
  def update_all(**attributes)
    return if attributes.empty?

    placeholder = case adapter.class.to_s
      when "Granite::Adapter::Pg" then "$"
      else "?"
    end

    params = [] of String
    args =  [] of Granite::Columns::Type

    attributes.each_with_index do |field, value, i|
      ch = placeholder == "?" ? "?" : "$#{i + 1}"
      params << "#{quote(field.to_s)}=#{ch}"
      args << value
    end

    sql = "UPDATE #{quoted_table_name} SET #{params.join(", ")}"
    
    elapsed_time = Time.measure do
      adapter.open &.exec(sql, args: args)
    end

    adapter.log(sql, elapsed_time, args)
  end

  def destroy_all
    clear
  end
end

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions