Module: Model::Extractor
- Extended by:
- ActiveSupport::Concern
- Included in:
- Wechat::Extractor
- Defined in:
- app/models/wechat/model/extractor.rb
Instance Method Summary collapse
- #effective?(time = Time.current) ⇒ Boolean
- #invoke_effect(request) ⇒ Object
- #scan_regexp ⇒ Object
- #serial_number(now = Time.current) ⇒ Object
Instance Method Details
#effective?(time = Time.current) ⇒ Boolean
50 51 52 |
# File 'app/models/wechat/model/extractor.rb', line 50 def effective?(time = Time.current) time > start_at.change(time.to_date.parts) && time < finish_at.change(time.to_date.parts) end |
#invoke_effect(request) ⇒ Object
29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
# File 'app/models/wechat/model/extractor.rb', line 29 def invoke_effect(request) matched = request.body.scan(scan_regexp) if matched.blank? return else logger.debug " \e[35m=====> Matched: #{matched.inspect}, Extractor: #{name}(#{id})\e[0m" end # 这里不用 find_or_initialize_by,因为可以建立 ex.extractor, 减少 belongs_to validation present 的数据库查询 ex = request.extractions.find_by(extractor_id: id) || request.extractions.build(extractor: self) ex.name = name ex.matched = matched.join(', ') if serial && effective?(request.created_at) ex.serial_number ||= serial_number r = ex.respond_text else r = invalid_response.presence end r end |
#scan_regexp ⇒ Object
21 22 23 24 25 26 27 |
# File 'app/models/wechat/model/extractor.rb', line 21 def scan_regexp if more /(?<=#{prefix}).*(?=#{suffix})/ else /(?<=#{prefix}).*?(?=#{suffix})/ end end |
#serial_number(now = Time.current) ⇒ Object
54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 |
# File 'app/models/wechat/model/extractor.rb', line 54 def serial_number(now = Time.current) begin_at = now.beginning_of_month - 1.day end_at = now.next_month.beginning_of_month - 1.day serial_init = serial_start.presence || (now.strftime('%Y%m') + '0001').to_i if now < end_at last_item = extractions.where.not(serial_number: nil).default_where('created_at-gte': begin_at).order(serial_number: :desc).first if last_item last_item.serial_number + 1 else serial_init end else serial_init = (now.next_month.strftime('%Y%m') + '0001').to_i last_item = extractions.where.not(serial_number: nil).default_where('created_at-gte': end_at).order(serial_number: :desc).first if last_item last_item.serial_number + 1 else serial_init end end end |