Module: Zena::Use::QueryNode::ModelMethods

Included in:
Node
Defined in:
lib/zena/use/query_node.rb

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.included(base) ⇒ Object



16
17
18
19
20
21
22
23
24
# File 'lib/zena/use/query_node.rb', line 16

def self.included(base)
  base.class_eval do
    include ::QueryBuilder
    extend ClassMethods
    self.query_compiler = Zena::Use::QueryNode::Compiler
    safe_method :db_attr => StringDictionary
    safe_method [:first, String]  => {:class => Node, :nil => true, :method => 'safe_first'}
  end
end

Instance Method Details

#db_attrObject

Return a hash with the values contained in the SQL query with ‘AS’ (used with custom queries).



63
64
65
66
67
68
# File 'lib/zena/use/query_node.rb', line 63

def db_attr
  @db_attr ||= Hash[*@attributes.select do |key, value|
    !self.class.column_names.include?(key)
    # db fetch only: select 'now() - created_at AS age' ----> 'age' can be read
  end.flatten]
end

#find(count, pseudo_sql = nil, opts = {}) ⇒ Object

Find related nodes. See Node#build_find for details on the options available. TODO: do we need rubyless translate here ? It should be removed.



33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
# File 'lib/zena/use/query_node.rb', line 33

def find(count, pseudo_sql = nil, opts = {})
  if pseudo_sql.nil?
    pseudo_sql = count
    count = Node.plural_relation?(pseudo_sql.split(' ').first) ? :all : :first
  end
  if !opts[:skip_rubyless] && type = RubyLess::SafeClass.safe_method_type_for(self.class, [pseudo_sql])
    self.send(type[:method])
  else
    begin
      query = self.class.build_query(count, pseudo_sql,
        :node_name       => 'self',
        :main_class      => virtual_class,
        :rubyless_helper => (opts[:rubyless_helper] || virtual_class), # should it be || self ?
        :default         => opts[:default]
      )
      if limit = opts[:limit]
        query.limit  = " LIMIT #{limit.to_i}"
        query.offset = " OFFSET #{opts[:offset].to_i}"
      end
    rescue ::QueryBuilder::Error => err
      return opts[:errors] ? err : nil
    end

    type = [:all, :first].include?(count) ? :find : :count

    Node.do_find(count, eval(query.to_s(type)))
  end
end

#safe_first(query) ⇒ Object



26
27
28
# File 'lib/zena/use/query_node.rb', line 26

def safe_first(query)
  find(:first, query, :skip_rubyless => true)
end

#start_node_zipObject



70
71
72
# File 'lib/zena/use/query_node.rb', line 70

def start_node_zip
  self.zip
end