2015-07-03 9 views
-1

Я новичок в ruby ​​на rails.Я пытаюсь найти брокеров, чье имя содержит «Jam», но это дает мне ошибку «неправильного количества аргументов» (2 для 1) ". Следующий мой код:Ruby on Rails & Mongomapper: неправильное количество аргументов (2 для 1)

@brokers = Broker.where("firstName = ?", "Jam") 

Почему я получаю неправильное количество аргументов ошибки?

+0

'@brokers = Broker.where (firstName:« Jam »)' – RAJ

+0

его ошибка. – Pritika

+0

он должен хэшировать как ключевое значение firstname является ключевым, а значение - вареньем –

ответ

2

Как вы используете MongoMapper, вы можете необходимо использовать all.Вы можете попробовать следующий запрос:

@brokers = Broker.all(firstName: "Jam") 

ИЛИ

@brokers = Broker.where(firstName: "Jam").all 

Источник: http://mongomapper.com/documentation/plugins/querying.html

Update:

Чтобы использовать like поведение, вы можете использовать регулярное выражение, такие как:

@brokers = Broker.all(firstName: /Jam/) 
+0

Как я могу использовать его с похожими? Я хочу получить все записи, содержащие «Jam» в firstName. – Pritika

+1

Отметить обновленный ответ – RAJ

+1

Привет, спасибо Raj :) – Pritika

2

Вы должны заключить его в массив:

@brokers = Broker.where(["brokers.firstName = ?", "Jam"]) 

Это, как говорится, мы должны знать свою версию рельсы (и рубин версия). Однако, если вы не заинтересованы в использовании LIKE, вы можете просто сделать

@brokers = Broker.where(firstName: "Jam") 

ActiveRecord имеет некоторые SQL-строитель, построенный в (и поддерживает arel, если вы хотите), который позволяет писать Brokers.where(hash_key: value) и преобразует его до SELECT * FROM brokers WHERE hash_key = value, поэтому вы можете писать простые запросы быстрее.

Версия, которую вы опубликовали, не работает, потому что where принимает одну строку, массив или хэш-карту, doesn't accept multiple params.

Update 1 (после обнаружения вы используете mongomapper):

После того, как обнаружил, что вы используете mongomapper, который очень отличается от установки в Rails по умолчанию (быть осторожным, если вы новичок, много вещей не будет применяться к вам, Rails по умолчанию использует activerecord), я считаю, что вам нужно добавить all в конце вашего звонка, как в этом question. Так что-то вроде:

@brokers = Broker.where(firstName: "Jam").all 

Также обратите внимание, что этот способ выполнения запросов не будет работать с mongomapper: (по крайней мере, проверяя документацию)

@brokers = Broker.where(["brokers.firstName = ?", "Jam"]) 

Таким образом, вы вынуждены использовать один с where(firstName: "Jam")

Update 2 (как выполнить запрос, похожий на SQL LIKE):

Если вы хотите, чтобы код вести себя подобным образом, как SQL LIKE, как вы запрашиваете в комментариях, вы можете использовать регулярное выражение, так что-то вроде:

@brokers = Broker.where(firstName: /.*Jam.*/) 
+1

Ошибка при доставке: # > – Pritika

+0

Итак, вы используете mongodb, это не стандартная комплектация рельсов, важно знать версию рельсов. И рубин немного устарел от 1.9.3 –

+0

Кроме того, какое исключение подняли? Это '# > 'это объект, а не ошибка. Вы пытались запустить 'to_a' на нем и посмотреть, содержит ли он данные? –