Sha256: d881e8ccf98c543c94dd44f74c35ea8fa028b72c4269ae31a95386dba524d216

Contents?: true

Size: 1.44 KB

Versions: 5

Compression:

Stored size: 1.44 KB

Contents

module Typus
  module Orm
    module Mongoid
      module Search

        include Typus::Orm::Base::Search

        def build_search_conditions(key, value)
          search_fields = typus_search_fields
          search_fields = search_fields.empty? ? { "name" => "@" } : search_fields

          search_query = search_fields.map do |key, type|
            related_model = self

            split_keys = key.split('.')
            split_keys[0..-2].each do |split_key|
              if related_model.responds_to? :relations && related_model.relations[split_key] && related_model.relations[split_key].embeded?
                related_model = related_model.relations[split_key]
              else
                raise "Search key '#{key}' is invalid. #{split_key} is not an embeded document" if related_model.embeded?
              end
            end

            field = related_model.fields[split_keys.last]
            raise "Search key '#{field.name}' is invalid." unless field
            value = field.serialize(value) if field.type.ancestors.include?(Numeric)

            {key => value}
          end

          {'$or' => search_query}
        end

        def build_filter_interval(interval, key)
          {key.to_sym.gt => interval.first, key.to_sym.lt => interval.last}
        end

        # TODO: Detect the primary_key for this object.
        def build_has_many_conditions(key, value)
          ["#{key}.id = ?", value]
        end

      end
    end
  end
end

Version data entries

5 entries across 5 versions & 1 rubygems

Version Path
typus-3.1.10 lib/typus/orm/mongoid/search.rb
typus-3.1.9 lib/typus/orm/mongoid/search.rb
typus-3.1.8 lib/typus/orm/mongoid/search.rb
typus-3.1.7 lib/typus/orm/mongoid/search.rb
typus-3.1.6 lib/typus/orm/mongoid/search.rb