Sha256: eec27867dddf277cbce4b51f86ee51c0125705e942aef8b629032d21f9314678

Contents?: true

Size: 1.59 KB

Versions: 17

Compression:

Stored size: 1.59 KB

Contents

module NinjaModel
  class RecordNotFound < NinjaModelError; end
  module FinderMethods
    def first(*args)
      if args.any?
        apply_finder_options(args.first).limit(1).to_a.first
      else
        find_first
      end
    end

    def all(*args)
      args.any? ? apply_finder_options(args.first).to_a : to_a
    end

    def find(*args)
      options = args.extract_options!

      if options.present?
        apply_finder_options(options).find(*args)
      else
        case args.first
        when :first, :all
          send(args.first)
        else
          find_with_ids(*args)
        end
      end
    end

    def exists?(id)
      where(primary_key.to_sym => id).limit(1)
      relation.first ? true : false
    end

    protected

    def find_with_ids(*ids)
      expects_array = ids.first.kind_of?(Array)

      return ids.first if expects_array && ids.first.empty?

      ids = ids.flatten.compact.uniq

      case ids.size
      when 0
        raise RecordNotFound, "Couldn't find #{@klass.name} without an ID"
      when 1
        result = find_one(ids.first)
        expects_array ? [result] : result
      else
        raise NotImplementedError, "Finding by multiple id's is not implemented"
      end
    end

    def find_one(id)
      id = id.id if NinjaModel::Base === id

      record = where(primary_key.to_sym => id).first
      unless record
        raise RecordNotFound, "Couldn't find #{@klass.name} with #{primary_key}=#{id}"
      end
      record
    end

    def find_first
      if loaded?
        @records.first
      else
        @first ||= limit(1).to_a[0]
      end
    end
  end
end

Version data entries

17 entries across 17 versions & 1 rubygems

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