Module: CouchPotato::Persistence::Properties::ClassMethods

Defined in:
lib/couch_potato/persistence/properties.rb

Instance Method Summary collapse

Instance Method Details

#property(name, options = {}) ⇒ Object

Declare a property on a model class. Properties are not typed by default. You can store anything in a property that can be serialized into JSON. If you want a property to be of a custom class you have to define it using the :type option.

example:

class Book
  property :title
  property :year
  property :publisher, type: Publisher
  property :published_at, default: -> { Date.current }
  property :next_year, default: ->(book) { book.year + 1 }
end


87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
# File 'lib/couch_potato/persistence/properties.rb', line 87

def property(name, options = {})
  # ActiveModel::AttributeMethods.generated_attribute_methods
  active_support_module = send(:generated_attribute_methods)

  # Mimic ActiveModel::AttributeMethods.undefine_attribute_methods, but only for this
  # property's accessor method
  active_support_module.module_eval do
    undef_method(name) if instance_methods.include?(name)
  end
  cache = if respond_to?(:attribute_method_matchers_cache, true) # activemodel 7.0
    send(:attribute_method_matchers_cache) 
  else # activemodel 7.1
    send(:attribute_method_patterns_cache) 
  end
  cache.delete(name)

  define_attribute_method name
  properties << SimpleProperty.new(self, name, options)

  # Remove the default ActiveModel::AttributeMethods accessor
  if active_support_module.instance_methods.include?(name)
    active_support_module.send(:remove_method, name)
  end
end

#property_namesObject

returns all the property names of a model class that have been defined using the #property method

example:

class Book
  property :title
  property :year
end
Book.property_names # => [:title, :year]


71
72
73
# File 'lib/couch_potato/persistence/properties.rb', line 71

def property_names
  properties.map(&:name)
end