2013-05-13 1 views
0

Я хочу знать, как проверить, существует ли элемент массива внутри массива MongoMapper. This question является самым близким, который я мог найти, но он обрабатывает запросы, а не просто использует документ, который у вас уже есть.Как вы называете "содержит?" на массиве MongoMapper в Rails 3?

Моя модель пользователя содержит строку

key :roles, Array 

массива «ролей», содержит такие строки, как «администратор» или «пользователь». Для авторизации мне нужно вызвать что-то вроде следующего метода на экземпляр пользователя:

if user.roles.contains?('admin') 
    # Do administrative stuff. 
end 

Но когда я пытаюсь позвонить 'contains?' Рубин жалуется, что нет такого метода: «? Содержит»

NoMethodError (undefined method `contains?' for #<Array:0x007fc845cd8948>): 
    app/models/ability.rb:11:in `initialize' 
    app/controllers/settings_controller.rb:5:in `index' 

Если нет никакого способа сделать это, то как я могу преобразовать массив в массив рубинового позвонить? Вызов to_a не делает этого:

if user.roles.to_a.contains?('admin') # etc... 

Я использую Rails 3.2.13, Ruby-1.9.3-p392 и MongoMapper 0.12.0 на Mountain Lion.

+0

Я незнаком с MongoDB, так это предложение noobish. Что возвращает 'user.roles'? – jason328

+0

Ответ: ... В массивах Ruby нет метода 'contains? '. Он называется 'include? '. Sigh ... –

+0

@ jason328 Он возвращал '# '. Во всяком случае, глупая ошибка с моей стороны не знать правильного имени метода. –

ответ

2

функция, которую вы ищете include?, так что выражение будет: user.roles.include?('admin')

Однако, так как вы упомянули mongomapper, если вы брикетирование запроса на массиве ролей вы бы сделать парование:

User.where(:roles => 'admin') 

вы также можете найти массив с массивом

User.where(:roles.in => ['admin']) 

для запроса с администратором или пользователем, вы можете сделать:

User.where(:$or => [{:roles => 'admin'},{:roles => 'user'}]) 

и вы можете сделать и так же:

User.where(:$and => [{:roles => 'admin'},{:roles => 'user'}]) 
+0

@muistooshort - да, я ошибся, что –