The purpose of the VirtualRow
class is to allow the easy creation of SQL
identifiers and functions, in a way that leads to more compact code.
An instance of this class is yielded to the block supplied to Dataset#where
, Dataset#order
, and Dataset#select
(and the other methods that accept a block and pass it to one of those methods). If the block doesn’t take an argument, the block is instance_execed in the context of an instance of this class.
VirtualRow
uses method_missing
to return either an Identifier
, Function
depending on how it is called.
Function |
Returned if any arguments are supplied, using the method name as the function name, and the arguments as the function arguments. |
Identifier |
Returned otherwise, using the method name. |
If splitting symbols has been enabled (not the default), then method calls without arguments will return QualifiedIdentifier
instances if the method call includes a double underscore.
Examples:
ds = DB[:t] # Argument yielded to block ds.where{|r| r.name < 2} # SELECT * FROM t WHERE (name < 2) # Block without argument (instance_exec) ds.where{name < 2} # SELECT * FROM t WHERE (name < 2) # Functions ds.where{is_active(1, 'arg2')} # SELECT * FROM t WHERE is_active(1, 'arg2') ds.select{version.function} # SELECT version() FROM t ds.select{count.function.*} # SELECT count(*) FROM t ds.select{count(col1).distinct} # SELECT count(DISTINCT col1) FROM t # Math Operators ds.select{|o| o.+(1, :a).as(:b)} # SELECT (1 + a) AS b FROM t ds.select{|o| o.-(2, :a).as(:b)} # SELECT (2 - a) AS b FROM t ds.select{|o| o.*(3, :a).as(:b)} # SELECT (3 * a) AS b FROM t ds.select{|o| o./(4, :a).as(:b)} # SELECT (4 / a) AS b FROM t # Boolean Operators ds.where{|o| o.&({a: 1}, :b)} # SELECT * FROM t WHERE ((a = 1) AND b) ds.where{|o| o.|({a: 1}, :b)} # SELECT * FROM t WHERE ((a = 1) OR b) ds.where{|o| o.~(a: 1)} # SELECT * FROM t WHERE (a != 1) ds.where{|o| o.~(a: 1, b: 2)} # SELECT * FROM t WHERE ((a != 1) OR (b != 2)) # Inequality Operators ds.where{|o| o.>(1, :a)} # SELECT * FROM t WHERE (1 > a) ds.where{|o| o.<(2, :a)} # SELECT * FROM t WHERE (2 < a) ds.where{|o| o.>=(3, :a)} # SELECT * FROM t WHERE (3 >= a) ds.where{|o| o.<=(4, :a)} # SELECT * FROM t WHERE (4 <= a)
For a more detailed explanation, see the Virtual Rows guide.
Included modules
Public Class methods
Public Instance methods
Return an Identifier
, QualifiedIdentifier
, or Function
, depending on arguments and whether a block is provided. Does not currently call the block. See the class level documentation.
# File lib/sequel/sql.rb 1921 def method_missing(m, *args) 1922 if args.empty? 1923 if Sequel.split_symbols? 1924 table, column = m.to_s.split('__', 2) 1925 column ? QualifiedIdentifier.new(table, column) : Identifier.new(m) 1926 else 1927 Identifier.new(m) 1928 end 1929 else 1930 Function.new(m, *args) 1931 end 1932 end