Sha256: 86e0f3fa65b7039c9e57d2a6ce142210a035b7a70535c94041eb0bed16f1805d

Contents?: true

Size: 1.98 KB

Versions: 13

Compression:

Stored size: 1.98 KB

Contents

require 'active_support'

module NinjaModel
  module QueryMethods
    extend ActiveSupport::Concern

    def order(*args)
      relation = clone
      relation.ordering += args.flatten unless args.blank?
      relation
    end

    def where(opts, *rest)
      relation = clone
      relation.predicates += build_predicates(opts, rest)
      relation
    end

    def limit(value)
      relation = clone
      relation.limit_value = value
      relation
    end

    def readonly(value)
      relation = clone
      relation.readonly_value = value
      relation
    end

    def extending(*modules)
      modules << Module.new(&Proc.new) if block_given?

      return self if modules.empty?

      relation = clone
      relation.send(:apply_modules, modules.flatten)
      relation
    end

    private

    def build_predicates(opts, other = [])
      case opts
      when String
        raise ArgumentError,
          "NinjaModel doesn't work with strings...yet. You'll need to use a predicate (see NinjaModel::Predicate::PREDICATES for a list)."
      when Array
        opts.collect do |o|
          build_predicates(o)
        end.flatten!
      when Hash
        opts.to_a.map do |o|
          raise ArgumentError, "Not sure what to do with #{o}" unless o.length.eql?(2)
          k = o[0]
          v = o[1]

          case k
          when NinjaModel::Predicate
            k.value = klass.model_attributes_hash[k.attribute].convert(v)
            k
          when Symbol, String
            raise ArgumentError, "#{klass} doesn't have an attribute #{k}." unless klass.attribute_method?(k)
            p = NinjaModel::Predicate.new(k.to_sym, :eq)
            p.value = klass.model_attributes_hash[p.attribute].convert(v)
            p
          else
            raise ArgumentError, "#{k} isn't a predicate or a symbol."
          end
        end
      when NinjaModel::Predicate
        [opts]
      else
        raise ArgumentError, "Unknown argument to #{self}.where: #{opts.inspect}"
      end
    end
  end
end

Version data entries

13 entries across 13 versions & 1 rubygems

Version Path
ninja-model-1.0.5 lib/ninja_model/relation/query_methods.rb
ninja-model-1.0.4 lib/ninja_model/relation/query_methods.rb
ninja-model-1.0.3 lib/ninja_model/relation/query_methods.rb
ninja-model-1.0.2 lib/ninja_model/relation/query_methods.rb
ninja-model-1.0.1 lib/ninja_model/relation/query_methods.rb
ninja-model-1.0.0 lib/ninja_model/relation/query_methods.rb
ninja-model-0.9.6 lib/ninja_model/relation/query_methods.rb
ninja-model-0.9.5 lib/ninja_model/relation/query_methods.rb
ninja-model-0.9.4 lib/ninja_model/relation/query_methods.rb
ninja-model-0.9.3 lib/ninja_model/relation/query_methods.rb
ninja-model-0.9.2 lib/ninja_model/relation/query_methods.rb
ninja-model-0.9.1 lib/ninja_model/relation/query_methods.rb
ninja-model-0.9.0 lib/ninja_model/relation/query_methods.rb