application_model.rb 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. require 'cache'
  2. class ApplicationModel < ActiveRecord::Base
  3. self.abstract_class = true
  4. before_create :cache_delete
  5. before_update :cache_delete_before
  6. before_destroy :cache_delete_before
  7. after_create :cache_delete
  8. after_update :cache_delete
  9. after_destroy :cache_delete
  10. # for import other objects, remove 'id'
  11. def self.attributes_protected_by_default
  12. if Setting.get('import_mode')
  13. ['type']
  14. else
  15. ['id','type']
  16. end
  17. end
  18. def self.param_cleanup(params)
  19. data = {}
  20. self.new.attributes.each {|item|
  21. if params.has_key?(item[0])
  22. # puts 'use ' + item[0].to_s + '-' + params[item[0]].to_s
  23. data[item[0].to_sym] = params[item[0]]
  24. end
  25. }
  26. # we do want to set this via database
  27. data.delete( :updated_at )
  28. data.delete( :created_at )
  29. data.delete( :updated_by_id )
  30. data.delete( :created_by_id )
  31. data
  32. end
  33. def cache_update(o)
  34. # puts 'u ' + self.class.to_s
  35. if self.respond_to?('cache_delete') then self.cache_delete end
  36. # puts 'g ' + group.class.to_s
  37. if o.respond_to?('cache_delete') then o.cache_delete end
  38. end
  39. def cache_delete_before
  40. old_object = self.class.where( :id => self.id ).first
  41. if old_object
  42. old_object.cache_delete
  43. end
  44. self.cache_delete
  45. end
  46. def cache_delete
  47. key = self.class.to_s + '::' + self.id.to_s
  48. Cache.delete( key.to_s )
  49. key = self.class.to_s + ':f:' + self.id.to_s
  50. Cache.delete( key.to_s )
  51. if self[:name]
  52. key = self.class.to_s + '::' + self.name.to_s
  53. Cache.delete( key.to_s )
  54. key = self.class.to_s + ':f:' + self.name.to_s
  55. Cache.delete( key.to_s )
  56. end
  57. if self[:login]
  58. key = self.class.to_s + '::' + self.login.to_s
  59. Cache.delete( key.to_s )
  60. key = self.class.to_s + ':f:' + self.login.to_s
  61. Cache.delete( key.to_s )
  62. end
  63. end
  64. def self.cache_set(data_id, data, full = false)
  65. if !full
  66. key = self.to_s + '::' + data_id.to_s
  67. else
  68. key = self.to_s + ':f:' + data_id.to_s
  69. end
  70. Cache.write( key.to_s, data )
  71. end
  72. def self.cache_get(data_id, full = false)
  73. if !full
  74. key = self.to_s + '::' + data_id.to_s
  75. else
  76. key = self.to_s + ':f:' + data_id.to_s
  77. end
  78. Cache.get( key.to_s )
  79. end
  80. def self.lookup(data)
  81. if data[:id]
  82. # puts "GET- + #{self.to_s}.#{data[:id].to_s}"
  83. cache = self.cache_get( data[:id] )
  84. return cache if cache
  85. # puts "Fillup- + #{self.to_s}.#{data[:id].to_s}"
  86. record = self.where( :id => data[:id] ).first
  87. self.cache_set( data[:id], record )
  88. return record
  89. elsif data[:name]
  90. cache = self.cache_get( data[:name] )
  91. return cache if cache
  92. records = self.where( :name => data[:name] )
  93. records.each {|record|
  94. if record.name == data[:name]
  95. self.cache_set( data[:name], record )
  96. return record
  97. end
  98. }
  99. return
  100. elsif data[:login]
  101. cache = self.cache_get( data[:login] )
  102. return cache if cache
  103. records = self.where( :login => data[:login] )
  104. records.each {|record|
  105. if record.login == data[:login]
  106. self.cache_set( data[:login], record )
  107. return record
  108. end
  109. }
  110. return
  111. else
  112. raise "Need name, id or login for lookup()"
  113. end
  114. end
  115. def self.create_if_not_exists(data)
  116. if data[:id]
  117. record = self.where( :id => data[:id] ).first
  118. return record if record
  119. elsif data[:name]
  120. records = self.where( :name => data[:name] )
  121. records.each {|record|
  122. return record if record.name == data[:name]
  123. }
  124. elsif data[:login]
  125. records = self.where( :login => data[:login] )
  126. records.each {|record|
  127. return record if record.login == data[:login]
  128. }
  129. elsif data[:locale] && data[:source]
  130. records = self.where( :locale => data[:locale], :source => data[:source] )
  131. records.each {|record|
  132. return record if record.source == data[:source]
  133. }
  134. end
  135. self.create(data)
  136. end
  137. def self.create_or_update(data)
  138. if data[:name]
  139. records = self.where( :name => data[:name] )
  140. records.each {|record|
  141. if record.name == data[:name]
  142. record.update_attributes( data )
  143. return record
  144. end
  145. }
  146. record = self.new( data )
  147. record.save
  148. return record
  149. else
  150. raise "Need name for create_or_update()"
  151. end
  152. end
  153. end