Module: Model::Extractor

Extended by:
ActiveSupport::Concern
Included in:
Wechat::Extractor
Defined in:
app/models/wechat/model/extractor.rb

Instance Method Summary collapse

Instance Method Details

#effective?(time = Time.current) ⇒ Boolean

Returns:

  • (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_regexpObject



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