123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687 |
- # Copyright (C) 2012-2016 Zammad Foundation, http://zammad-foundation.org/
- module ApplicationModel::CanLookup
- extend ActiveSupport::Concern
- # methods defined here are going to extend the class, not the instance of it
- class_methods do
- =begin
- lookup model from cache (if exists) or retrieve it from db, id, name, login or email possible
- result = Model.lookup(id: 123)
- result = Model.lookup(name: 'some name')
- result = Model.lookup(login: 'some login')
- result = Model.lookup(email: 'some login')
- returns
- result = model # with all attributes
- =end
- def lookup(data)
- if data[:id]
- cache = cache_get(data[:id])
- return cache if cache
- record = find_by(id: data[:id])
- cache_set(data[:id], record)
- return record
- elsif data[:name]
- cache = cache_get(data[:name])
- return cache if cache
- # do lookup with == to handle case insensitive databases
- records = if Rails.application.config.db_case_sensitive
- where('LOWER(name) = LOWER(?)', data[:name])
- else
- where(name: data[:name])
- end
- records.each do |loop_record|
- if loop_record.name == data[:name]
- cache_set(data[:name], loop_record)
- return loop_record
- end
- end
- return
- elsif data[:login]
- cache = cache_get(data[:login])
- return cache if cache
- # do lookup with == to handle case insensitive databases
- records = if Rails.application.config.db_case_sensitive
- where('LOWER(login) = LOWER(?)', data[:login])
- else
- where(login: data[:login])
- end
- records.each do |loop_record|
- if loop_record.login == data[:login]
- cache_set(data[:login], loop_record)
- return loop_record
- end
- end
- return
- elsif data[:email]
- cache = cache_get(data[:email])
- return cache if cache
- # do lookup with == to handle case insensitive databases
- records = if Rails.application.config.db_case_sensitive
- where('LOWER(email) = LOWER(?)', data[:email])
- else
- where(email: data[:email])
- end
- records.each do |loop_record|
- if loop_record.email == data[:email]
- cache_set(data[:email], loop_record)
- return loop_record
- end
- end
- return
- end
- raise ArgumentError, 'Need name, id, login or email for lookup()'
- end
- end
- end
|