Module: Flex::Scopes::ClassMethods

Defined in:
lib/flex/scopes.rb

Instance Method Summary collapse

Instance Method Details

#scope(name, scope = nil, &block) ⇒ Object

define scopes as class methods

class MyModel
  include Flex::StoredModel
  ...
  scope :red, terms(:color => 'red').sort(:supplier => :asc)
  scope :size do |size|
    terms(:size => size)
  end

  MyModel.size('large').first
  MyModel.red.all
  MyModel.size('small').red.all

Raises:

  • (ArgumentError)


62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
# File 'lib/flex/scopes.rb', line 62

def scope(name, scope=nil, &block)
  raise ArgumentError, "Dangerous scope name: a :#{name} method is already defined. Please, use another one." \
        if respond_to?(name)
  proc = case
         when block_given?
           block
         when scope.is_a?(Flex::Scope)
           lambda {scope}
         when scope.is_a?(Proc)
           scope
         else
           raise ArgumentError, "Scope object or Proc expected (got #{scope.inspect})"
         end
  metaclass = class << self; self end
  metaclass.send(:define_method, name) do |*args|
    scope = proc.call(*args)
    raise Scope::Error, "The scope :#{name} does not return a Flex::Scope object (got #{scope.inspect})" \
          unless scope.is_a?(Flex::Scope)
    scope
  end
  scope_methods << name
end

#scopedObject

You can start with a non restricted Flex::Scope object



43
44
45
# File 'lib/flex/scopes.rb', line 43

def scoped
  @scoped ||= Scope[:context => flex.context]
end