Module: ModelFact::Helpers::ActiveRecordHelper::ClassMethods
- Includes:
- TR::CondUtils
- Defined in:
- lib/model_fact/helpers/ar_helpers.rb
Instance Method Summary collapse
-
#filter(opts = {}, &block) ⇒ Object
Standardized search API.
- #find_record(opts = {}, &block) ⇒ Object (also: #find_records)
- #first(row = 1) ⇒ Object
- #is_paginated? ⇒ Boolean
- #last(row = 1) ⇒ Object
- #listeners ⇒ Object
- #on_event(evt, opts = { }, &block) ⇒ Object
-
#paginate(opts = {}) ⇒ Object
Paginate helpers.
- #per_page_count ⇒ Object
- #per_page_count=(val) ⇒ Object
-
#record_translator(&block) ⇒ Object
def last_record(count = 1) translate(self.last(count).first) end.
- #remove(rec) ⇒ Object
- #remove_all ⇒ Object
- #translate(rec) ⇒ Object
Instance Method Details
#filter(opts = {}, &block) ⇒ Object
Standardized search API
Issue : Record need to be part of the business object as Banis is controller driven. Whatever return from AR need to be converted to business model which difficult to be done generically
41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 |
# File 'lib/model_fact/helpers/ar_helpers.rb', line 41 def filter(opts = {}, &block) res = self.all @goToPage = 0 if block filter = FilterBuilder.new flt = block.call(:cond, filter) orArray = [] if not_empty?(flt.main_cond) flt.main_cond.each do |val| val.each do |k,v| case k when :and res = res.where(v) when :or val[:or].each do |r,vv| orArray << ["#{r} = #{vv}"] end end end end res = res.where("(#{orArray.join(" or ")})") if not_empty?(orArray) end if not_empty?(flt.modifier) flt.modifier.each do |mod| mod.each do |k,v| case k when :sort res = res.order(v) when :first cnt = v || 1 res = res.first(cnt) when :last cnt = v || 1 res = res.last(cnt) when :page @goToPage = v end end end end ignorePaging = block.call(:ignore_paging?) ignorePaging = false if is_empty?(ignorePaging) if is_paginated? and not ignorePaging ttl = res.count block.call(:result, :total_record, ttl) ttlPage = (ttl/per_page_count).to_i ttlPage += 1 if (ttlPage*per_page_count) != ttl block.call(:result, :total_page, ttlPage) res = res.limit(per_page_count) if @goToPage <= 0 block.call(:result, :first_page?, true) else block.call(:result, :first_page?, false) end offset = @goToPage * per_page_count res = res.offset(offset) if (offset+per_page_count) >= ttl block.call(:result, :last_page?, true) else block.call(:result, :last_page?, false) end end if flt.is_return_count? res.count else translate(res) end else translate(res) end end |
#find_record(opts = {}, &block) ⇒ Object Also known as: find_records
161 162 163 164 165 166 167 168 169 170 |
# File 'lib/model_fact/helpers/ar_helpers.rb', line 161 def find_record(opts = {}, &block) self.filter do |ops, *val| case ops when :cond val.first.filter(opts) else block.call(ops, *val) if block end end end |
#first(row = 1) ⇒ Object
141 142 143 144 145 146 147 148 149 |
# File 'lib/model_fact/helpers/ar_helpers.rb', line 141 def first(row = 1) res = self.filter do |ops, val| case ops when :cond val.first(row) end end res.first if row == 1 end |
#is_paginated? ⇒ Boolean
272 273 274 |
# File 'lib/model_fact/helpers/ar_helpers.rb', line 272 def is_paginated? not_empty?(@_paginate) and @_paginate end |
#last(row = 1) ⇒ Object
151 152 153 154 155 156 157 158 159 |
# File 'lib/model_fact/helpers/ar_helpers.rb', line 151 def last(row = 1) res = self.filter do |ops, val| case ops when :cond val.last(row) end end res.first if row == 1 end |
#listeners ⇒ Object
29 30 31 |
# File 'lib/model_fact/helpers/ar_helpers.rb', line 29 def listeners _listeners.freeze end |
#on_event(evt, opts = { }, &block) ⇒ Object
16 17 18 19 20 21 22 23 24 25 26 27 |
# File 'lib/model_fact/helpers/ar_helpers.rb', line 16 def on_event(evt, opts = { }, &block) _listeners[evt] = [] if _listeners[evt].nil? case evt when :before_save _listeners[evt] << block self.class.class_eval <<-END before_save :_mf_trigger_listener(:before_save) END end end |
#paginate(opts = {}) ⇒ Object
Paginate helpers
259 260 261 262 |
# File 'lib/model_fact/helpers/ar_helpers.rb', line 259 def paginate(opts = {}) @_per_page = opts[:per_page] || 10 @_paginate = true end |
#per_page_count ⇒ Object
264 265 266 |
# File 'lib/model_fact/helpers/ar_helpers.rb', line 264 def per_page_count @_per_page end |
#per_page_count=(val) ⇒ Object
268 269 270 |
# File 'lib/model_fact/helpers/ar_helpers.rb', line 268 def per_page_count=(val) @_per_page = val end |
#record_translator(&block) ⇒ Object
def last_record(count = 1)
translate(self.last(count).first)
end
246 247 248 |
# File 'lib/model_fact/helpers/ar_helpers.rb', line 246 def record_translator(&block) @recTranslator = block end |
#remove(rec) ⇒ Object
133 134 135 |
# File 'lib/model_fact/helpers/ar_helpers.rb', line 133 def remove(rec) self.delete(rec) end |
#remove_all ⇒ Object
137 138 139 |
# File 'lib/model_fact/helpers/ar_helpers.rb', line 137 def remove_all self.delete_all end |
#translate(rec) ⇒ Object
250 251 252 253 254 255 256 |
# File 'lib/model_fact/helpers/ar_helpers.rb', line 250 def translate(rec) if @recTranslator @recTranslator.call(rec) else rec end end |