• M
    Add Relation#annotate for SQL commenting · f4182580
    Matt Yoho 提交于
    This patch has two main portions:
    
    1. Add SQL comment support to Arel via Arel::Nodes::Comment.
    2. Implement a Relation#annotate method on top of that.
    
    == Adding SQL comment support
    
    Adds a new Arel::Nodes::Comment node that represents an optional SQL
    comment and teachers the relevant visitors how to handle it.
    
    Comment nodes may be added to the basic CRUD statement nodes and set
    through any of the four (Select|Insert|Update|Delete)Manager objects.
    
    For example:
    
        manager = Arel::UpdateManager.new
        manager.table table
        manager.comment("annotation")
        manager.to_sql # UPDATE "users" /* annotation */
    
    This new node type will be used by ActiveRecord::Relation to enable
    query annotation via SQL comments.
    
    == Implementing the Relation#annotate method
    
    Implements `ActiveRecord::Relation#annotate`, which accepts a comment
    string that will be appeneded to any queries generated by the relation.
    
    Some examples:
    
        relation = Post.where(id: 123).annotate("metadata string")
        relation.first
        # SELECT "posts".* FROM "posts" WHERE "posts"."id" = 123
        # LIMIT 1 /* metadata string */
    
        class Tag < ActiveRecord::Base
          scope :foo_annotated, -> { annotate("foo") }
        end
        Tag.foo_annotated.annotate("bar").first
        # SELECT "tags".* FROM "tags" LIMIT 1 /* foo */ /* bar */
    
    Also wires up the plumbing so this works with `#update_all` and
    `#delete_all` as well.
    
    This feature is useful for instrumentation and general analysis of
    queries generated at runtime.
    f4182580
query_methods.rb 43.0 KB