-
Notifications
You must be signed in to change notification settings - Fork 89
Open
Description
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