Skip to content

Instantly share code, notes, and snippets.

@pocke
Created March 12, 2024 06:16
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save pocke/9167bcdb8c13f7550da4ab322b99c229 to your computer and use it in GitHub Desktop.
Save pocke/9167bcdb8c13f7550da4ab322b99c229 to your computer and use it in GitHub Desktop.
わたしがつくりました prototype
module ArProducer
class CollectorProxy
attr_accessor :preparable
def initialize(collector)
@collector = collector
@last_str = nil
end
attr_reader :last_str
def <<(str)
@collector << str
@last_str = str
self
end
def add_bind(obj)
@collector.add_bind(obj)
self
end
def add_binds(binds, proc_for_binds = nil)
@collector.add_binds(binds, proc_for_binds)
self
end
def value
@collector.value
end
end
module ArelNodeExtension
def initialize
super
@ar_producer_backtrace = caller
end
attr_reader :ar_producer_backtrace
end
module ArelVisitorExtension
def accept(object, collector)
super(object, CollectorProxy.new(collector))
end
private
%i[
visit_Arel_Nodes_Ascending
visit_Arel_Nodes_Descending
visit_Arel_Nodes_Equality
visit_Arel_Nodes_InnerJoin
].each do |method_name|
define_method(method_name) do |o, collector|
comment = " /* #{format_producer(o)} */\n"
res = super(o, collector)
res << comment unless collector.last_str.end_with?(comment)
res
end
end
def format_producer(o)
Rails.backtrace_cleaner.clean(o.ar_producer_backtrace).first
end
end
end
Arel::Nodes::Node.include ArProducer::ArelNodeExtension
Arel::Visitors::ToSql.prepend ArProducer::ArelVisitorExtension
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment