XQuery
XQuery is designed to replace boring method call chains and allow to easier
convert it in a builder classes
Usage of XQuery function
XQuery is a shortcat to XQuery::Generic.with
r = XQuery(''.html_safe) do |q|
# similar to tap
q << 'bla bla bla'
q << 'bla bla bla'
# using truncate
q.truncate(15)
# real content (q.send(:query)) mutated
q << '!'
end
r # => "bla bla blab...!"
Usage of XQuery::Abstract
I designed this gem to help me with ActiveRecord Queries, so i inherited
XQuery::Abstract and used it's powers. It provides the following features
wrap_method and wrap_methods
when you call each of this methods they became automatically wrapped
(XQuery::Abstract basically wraps all methods query #respond_to?)
It means, that there are instance methods with same name defined and will
change a #query to their call result.
self.query = query.foo(x)
# is basically the same as
foo(x)
# when `wrap_method :foo` called
You can also specify new name using wrap_method :foo, as: :bar syntax
q object
q is a proxy object which holds all of wrapped methods,
but not methods you defined inside your class.
E.g. i have defined wrap_method(:foo), but also delegated #foo to some
another object. If i call q.foo, i will get wrapped method.
Note, that if you redefine #__foo method, q.foo will call it instead of
normal work.
You can add additional methods to q using something like alias_on_q :foo.
I used it with kaminary and it was useful
def page=(x)
apply { |query| query.page(x) }
end
alias_on_q :page=
def page
query.current_page
end
alias_on_q :page
query_superclass
You should specify query_superclass class_attribute to inherit
XQuery::Abstract. Whenever query.is_a?(query_superclass) evaluate to false,
you will get XQuery::QuerySuperclassChanged exception.
It can save you much time when your class misconfigured.
E.g. you are using select! and it returns nil, because why not?
#apply method
#apply does exact what it source tells
# yields query inside block
# @param block [#to_proc]
# @return [XQuery::Abstract] self
def apply(&block)
self.query = block.call(query)
self
end
It is usefull to merge different queries.
with class method
You can get XQuery functionality even you have not defined a specific class
(You are still have to inherit XQuery::Abstract to use it)
You can see it in this document when i described XQuery function.
Note, that it yields a class instance, not q object.
It accepts any arguments, they will be passed to a constructor (except block)
execute method
Preferred way to call public instance methods. Resulting query would be returned