Module: IdentityCache::ConfigurationDSL::ClassMethods
- Defined in:
- lib/identity_cache/configuration_dsl.rb
Instance Method Summary collapse
-
#cache_attribute(attribute, options = {}) ⇒ Object
Will cache a single attribute on its own blob, it will add a fetch_attribute_by_id (or the value of the by option).
-
#cache_has_many(association, options = {}) ⇒ Object
Will cache an association to the class including IdentityCache.
-
#cache_has_one(association, options = {}) ⇒ Object
Will cache an association to the class including IdentityCache.
-
#cache_index(*fields) ⇒ Object
Declares a new index in the cache for the class where IdentityCache was included.
- #disable_primary_cache_index ⇒ Object
Instance Method Details
#cache_attribute(attribute, options = {}) ⇒ Object
Will cache a single attribute on its own blob, it will add a fetch_attribute_by_id (or the value of the by option).
Example:
class Product
include IdentityCache
cache_attribute :quantity, by: :name
cache_attribute :quantity, by: [:name, :vendor]
end
Parameters
attribute
Symbol with the name of the attribute being cached
Options
-
by: Other attribute or attributes in the model to keep values indexed. Default is :id
-
unique: if the index would only have unique values. Default is true
173 174 175 |
# File 'lib/identity_cache/configuration_dsl.rb', line 173 def cache_attribute(attribute, = {}) cache_attribute_by_alias(attribute.inspect, attribute, ) end |
#cache_has_many(association, options = {}) ⇒ Object
Will cache an association to the class including IdentityCache. The embed option, if set, will make IdentityCache keep the association values in the same cache entry as the parent.
Embedded associations are more effective in offloading database work, however they will increase the size of the cache entries and make the whole entry expire when any of the embedded members change.
Example:
class Product
include IdentityCache
has_many :options
has_many :orders
has_many :buyers
cache_has_many :options, embed: :ids
cache_has_many :orders
cache_has_many :buyers, inverse_name: 'line_item'
end
Parameters
association
Name of the association being cached as a symbol
Options
-
embed: If set to true, will cause IdentityCache to keep the values for this association in the same cache entry as the parent, instead of its own.
-
inverse_name: The name of the parent in the association if the name is not the lowercase pluralization of the parent object’s class
103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 |
# File 'lib/identity_cache/configuration_dsl.rb', line 103 def cache_has_many(association, = {}) ensure_base_model = .slice(:embed, :inverse_name) [:embed] = :ids unless .has_key?(:embed) (, false, :ids) ensure_cacheable_association(association, ) self.cached_has_manys[association] = case [:embed] when true build_recursive_association_cache(association, ) when :ids (association, ) else raise NotImplementedError end end |
#cache_has_one(association, options = {}) ⇒ Object
Will cache an association to the class including IdentityCache. IdentityCache will keep the association values in the same cache entry as the parent.
Example:
class Product
cache_has_one :store, embed: true
cache_has_one :vendor
end
Parameters
association
Symbol with the name of the association being cached
Options
-
embed: Only true is supported, which is also the default, so IdentityCache will keep the values for this association in the same cache entry as the parent, instead of its own.
-
inverse_name: The name of the parent in the association ( only necessary if the name is not the lowercase pluralization of the parent object’s class)
142 143 144 145 146 147 148 149 150 151 152 153 154 |
# File 'lib/identity_cache/configuration_dsl.rb', line 142 def cache_has_one(association, = {}) ensure_base_model = .slice(:embed, :inverse_name) [:embed] = true unless .has_key?(:embed) ensure_cacheable_association(association, ) self.cached_has_ones[association] = if [:embed] == true build_recursive_association_cache(association, ) else raise NotImplementedError end end |
#cache_index(*fields) ⇒ Object
Declares a new index in the cache for the class where IdentityCache was included.
IdentityCache will add a fetch_by_field1_and_field2_and_…field for every index.
Example:
class Product
include IdentityCache
cache_index :name, :vendor
end
Will add Product.fetch_by_name_and_vendor
Parameters
fields
Array of symbols or strings representing the fields in the index
Options
-
unique: if the index would only have unique values
42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 |
# File 'lib/identity_cache/configuration_dsl.rb', line 42 def cache_index(*fields) raise NotImplementedError, "Cache indexes need an enabled primary index" unless primary_cache_index_enabled = fields. unique = [:unique] || false cache_attribute_by_alias('primary_key', 'id', by: fields, unique: unique) field_list = fields.join("_and_") arg_list = (0...fields.size).collect { |i| "arg#{i}" }.join(',') if unique self.instance_eval(ruby = <<-CODE, __FILE__, __LINE__ + 1) def fetch_by_#{field_list}(#{arg_list}, options={}) id = fetch_id_by_#{field_list}(#{arg_list}) id && fetch_by_id(id, options) end # exception throwing variant def fetch_by_#{field_list}!(#{arg_list}, options={}) fetch_by_#{field_list}(#{arg_list}, options) or raise ActiveRecord::RecordNotFound end CODE else self.instance_eval(ruby = <<-CODE, __FILE__, __LINE__ + 1) def fetch_by_#{field_list}(#{arg_list}, options={}) ids = fetch_id_by_#{field_list}(#{arg_list}) ids.empty? ? ids : fetch_multi(ids, options) end CODE end end |
#disable_primary_cache_index ⇒ Object
177 178 179 180 |
# File 'lib/identity_cache/configuration_dsl.rb', line 177 def disable_primary_cache_index ensure_base_model self.primary_cache_index_enabled = false end |