12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697 |
- # 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|
- next if loop_record.name != data[:name]
- cache_set(data[:name], loop_record)
- return loop_record
- 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|
- next if loop_record.login != data[:login]
- cache_set(data[:login], loop_record)
- return loop_record
- 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|
- next if loop_record.email != data[:email]
- cache_set(data[:email], loop_record)
- return loop_record
- end
- return
- elsif data[:number]
- # do lookup with == to handle case insensitive databases
- records = if Rails.application.config.db_case_sensitive
- where('LOWER(number) = LOWER(?)', data[:number])
- else
- where(number: data[:number])
- end
- records.each do |loop_record|
- next if loop_record.number != data[:number]
- return loop_record
- end
- return
- end
- raise ArgumentError, 'Need name, id, number, login or email for lookup()'
- end
- end
- end
|