2014-01-28 3 views
1

У меня есть поле в моей базе данных Монго с хэш-значением, например:Найти записи, где поле Hash содержит заданное значение

Company.find('testCompany').categories 
=> {"architects"=>"architects", "landscape_designers"=>"landscape_designers"} 

Как я могу сделать .гд выбрать на этом поле? Итак, я могу найти записи по отдельным категориям? Как я искать свою базу данных для «landscape_designers» и получить все записи, которые он включен в там категории хэш

я нашел что-то вроде

Company.where(:'categories.landscape_designers'.gt => 0) 

, но он не работает.

благодарит заранее!

ответ

-1

Используйте это в вашей модели компании

def method_name 
    categories.where("landscape_designers > ?", 0) 
end 
+0

а затем использовать его как? – marvwhere

+0

вы можете назвать это имя метода как объект компании, такой как компания, то company.method_name – Dheer

3

Если ключ и значение в categories Hash всегда одинаковы, то:

Company.where('categories.landscape_designers' => 'landscape_designers') 

должен сделать трюк. Если вы просто хотите увидеть, если есть landscape_designers ключ в categories, то вы можете использовать $exists:

Company.where(:'categories.landscape_designers'.exists => true) 
Company.where('categories.landscape_designers' => { :$exists => true }) 

Обратите внимание, что:

$existsделает соответствия документов, которые содержат поле, которое хранит значение null ,

$exists будет соответствовать :categories => { :landscape_designers => nil }. Если вы хотите исключить этот патологический случай, то:

Company.where(:'categories.landscape_designers'.ne => nil) 
Company.where('categories.landscape_designers' => { :$ne => nil }) 

В любом случае, я думаю, что у вас проблемы с дизайном с вашей схемой. Ваш categories выглядит как набор, а не хеш, поэтому вы вводите в заблуждение логический тип полей с его реализацией. Вы можете использовать Array вместо Hash и позволить мульти-ключам MongoDB заботиться о поиске массива; например, ваша модель будет сказать:

field :categories, :type => Array 
# and maybe some uniqueness validation or cleanup 

и тогда вы могли бы рассматривать массив как скаляр в ваших поисках:

Company.where(:categories => 'landscape_designers') 

Тогда MongoDB будет разворачивать массив для вас.

Вы можете также обезьяна патч пару вещей в Set:

class Set 
    def mongoize 
    self.to_a 
    end 

    def self.demongoize(object) 
    self.new(object) 
    end 

    def self.mongoize(object) 
    if(object.is_a?(Set)) 
     object.mongoize 
    else 
     object 
    end 
    end 

    def self.evolve(object) 
    if(object.is_a?(Set)) 
     object.mongoize 
    else 
     object 
    end 
    end 
end 

, а затем использовать:

field :categories, :type => Set 

, чтобы получить автоматическое поведение набора в Руби-земля и массив внутри MongoDB.

+0

спасибо!Я сделал обходной путь на данный момент, когда я помещал ключи хеша в новое поле массива, в 'before_save', но kinda suxx - забавная вещь - это поле: categories,: type => Array "находится в модели. но параметры формы post помещают его как хэш в мое поле (несколько флажков) - но thx, который помогает много! – marvwhere

+0

Вы также можете переопределить метод 'categories =', чтобы преобразовать стиль хэша в стиле funky {: a =>: a} 'в разумный массив. Mongoid вызовет метод mutator, когда вы «update_attributes». –

Смежные вопросы