Module: SimpleHstoreAccessor
- Defined in:
- lib/simple_hstore_accessor.rb,
lib/simple_hstore_accessor/version.rb
Constant Summary collapse
- VERSION =
"0.1.0"
Instance Method Summary collapse
-
#store_accessor(hstore_attribute, *keys) ⇒ Object
Public: Rails4-like method which defines simple accessors for hstore fields.
Instance Method Details
#store_accessor(hstore_attribute, *keys) ⇒ Object
Public: Rails4-like method which defines simple accessors for hstore fields
hstore_attribute - your Hstore column keys - Array of fields in your hstore
Example
class Person < ActiveRecord::Base
store_accessor :favorites_info, :book, :color
end
Returns nothing
19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
# File 'lib/simple_hstore_accessor.rb', line 19 def store_accessor(hstore_attribute, *keys) serialize hstore_attribute, ActiveRecord::Coders::Hstore Array(keys).flatten.each do |key| define_method("#{key}=") do |value| send("#{hstore_attribute}_will_change!") send("#{hstore_attribute}=", (send(hstore_attribute) || {}).merge(key.to_s => value)) end define_method(key) do send(hstore_attribute) && send(hstore_attribute)[key.to_s] end define_method("#{key}_will_change!") { attribute_will_change!(key.to_s) } define_method("#{key}_changed?") { attribute_changed?(key.to_s) } end define_method("#{hstore_attribute}=") do |new_properties| current_properties = send(hstore_attribute) || {} (current_properties.keys | new_properties.keys).each do |key| next if current_properties[key].to_s == new_properties[key].to_s || !respond_to?("#{key}_will_change!") send("#{key}_will_change!") end super(new_properties) end end |