module NoBrainer::Document::VirtualAttributes::ClassMethods
Public Instance Methods
field(attr, options={})
click to toggle source
Calls superclass method
# File lib/no_brainer/document/virtual_attributes.rb, line 19 def field(attr, options={}) return super unless options.key?(:virtual) raise "virtual attributes are limited to the root class `#{self.root_class}' for the moment.\n" + "Ask on GitHub for polymorphic support." unless is_root_class? raise "You cannot index a virtual attribute. Use an index with a lambda expression instead" if options[:index] options.assert_valid_keys(*VALID_VIRTUAL_FIELD_OPTIONS) self.virtual_fields ||= Set.new virtual_fields << attr inject_in_layer :virtual_attributes do define_method("#{attr}=") do |value| raise NoBrainer::Error::ReadonlyField.new("#{attr} is a virtual attribute and thus readonly.") end end super end
remove_field(attr, options={})
click to toggle source
Calls superclass method
# File lib/no_brainer/document/virtual_attributes.rb, line 40 def remove_field(attr, options={}) super if fields[:virtual] virtual_fields.try(:delete, attr) inject_in_layer :virtual_attributes do remove_method("#{attr}=") end end end
virtual_field(attr, rql=nil, options={}, &block)
click to toggle source
# File lib/no_brainer/document/virtual_attributes.rb, line 12 def virtual_field(attr, rql=nil, options={}, &block) rql, options = nil, rql if rql.is_a?(Hash) rql ||= block rql_proc = rql.is_a?(Proc) ? rql : proc { rql } field(attr, options.merge(:virtual => rql_proc)) end