Как передать второй параметр в Mongo :: Collection # find? - PullRequest
1 голос
/ 13 января 2012

Это вопрос новичка. Я нахожу определение метода в YARD Rdoc:

(Object) find(selector = {}, opts = {})


Options Hash (opts):
:fields (Array, Hash) 

затем я пытаюсь использовать это coll.find ('English' => 'fulcrum', {English: 1, Chinese: 1}), хочу, чтобы в результате в поле "English" было указано значение fulcrum, и возвращаются только поля English и Chinese, но Руби наказала меня этим

irb(main):018:0> coll.find('English' => 'fulcrum',{English:1,Chinese:1})
SyntaxError: (irb):18: syntax error, unexpected ')', expecting tASSOC
    from /usr/local/bin/irb:12:in `<main>'
irb(main):019:0> 

Я хочу знать, почему, спасибо

после исправления проблемы с синтаксисом по предложению @mu я получил сообщение об ошибке Unknown options:

irb(main):013:0> coll.find({English:'fulcrum'},{English:1, :Chinese => 1})RuntimeError: Unknown options [{:English=>1, :Chinese=>1}]
    from /usr/local/lib/ruby/gems/1.9.1/gems/mongo-1.5.2/lib/mongo/collection.rb:234:in `find'
    from (irb):13
    from /usr/local/bin/irb:12:in `<main>'
irb(main):014:0> 

1 Ответ

2 голосов
/ 13 января 2012

Когда Ruby видит развернутый хеш в списке аргументов:

o.m(k => v, ...)

предполагается, что вы действительно имеете в виду это:

o.m({ k => v, ... })

Итак, когда вы говорите это:

coll.find('English' => 'fulcrum', {English: 1, Chinese: 1})

Руби видит это:

coll.find({ 'English' => 'fulcrum', {English: 1, Chinese: 1} })

Hash - это совершенно правильный ключ, поэтому Ruby ожидает, что за ним последует => value:

coll.find('English' => 'fulcrum', {English: 1, Chinese: 1} => some_value)

и вот откуда приходит сообщение об ошибке:

syntax error, unexpected ')', expecting tASSOC

Если вы хотите передать два хэша, вам нужно обернуть первый в фигурные скобки:

coll.find({'English' => 'fulcrum'}, {English: 1, Chinese: 1})

Второй аргумент для [find] ( http://api.mongodb.org/ruby/current/Mongo/Collection.html#find-instance_method) должен быть опцией Hash, и похоже, что вы хотите опцию :fields, и вы можете задать массив имен вместо шумного Hash:

coll.find({'English' => 'fulcrum'}, :fields => %w[English Chinese])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...