Sha256: 054f9e3a1c475c646388f300f7e00df99fb1af98f3583f96e64353fdc1891126
Contents?: true
Size: 1.55 KB
Versions: 34
Compression:
Stored size: 1.55 KB
Contents
# The query extension adds Sequel::Dataset#query which allows # a different way to construct queries instead of the usual # method chaining. module Sequel class Database # Return a dataset modified by the query block def query(&block) dataset.query(&block) end end class Dataset # Translates a query block into a dataset. Query blocks can be useful # when expressing complex SELECT statements, e.g.: # # dataset = DB[:items].query do # select :x, :y, :z # filter{|o| (o.x > 1) & (o.y > 2)} # order :z.desc # end # # Which is the same as: # # dataset = DB[:items].select(:x, :y, :z).filter{|o| (o.x > 1) & (o.y > 2)}.order(:z.desc) # # Note that inside a call to query, you cannot call each, insert, update, # or delete (or any method that calls those), or Sequel will raise an # error. def query(&block) copy = clone({}) copy.extend(QueryBlockCopy) copy.instance_eval(&block) clone(copy.opts) end # Module used by Dataset#query that has the effect of making all # dataset methods into !-style methods that modify the receiver. module QueryBlockCopy %w'each insert update delete'.each do |meth| define_method(meth){|*args| raise Error, "##{meth} cannot be invoked inside a query block."} end # Merge the given options into the receiver's options and return the receiver # instead of cloning the receiver. def clone(opts = nil) @opts.merge!(opts) self end end end end
Version data entries
34 entries across 34 versions & 2 rubygems