2015-03-10 3 views
0

Мне нужно получить записи mongodb в приложении sinatra с помощью Mongoid. Для этого я пытаюсь сделать заказ записи, извлекаемые с помощью следующего запроса:order_by в Mongoid вдоль find_by, NoMethodError - неопределенный метод `order_by '

@bin = Bin.find_by(bin_id: params[:bin_id]).order_by(:created_at.desc)

Но я получаю NoMethodError,

NoMethodError - undefined method `order_by' for #<Bin:0x00000101d24d60>: 
/Users/harshsingh/Documents/Codes/mogreet-requestbin/app.rb:79:in `block in <class:App>' 
/Users/harshsingh/.rvm/gems/ruby-2.1.2/gems/sinatra-1.4.5/lib/sinatra/base.rb:1603:in `call' 
/Users/harshsingh/.rvm/gems/ruby-2.1.2/gems/sinatra-1.4.5/lib/sinatra/base.rb:1603:in `block in compile!' 
/Users/harshsingh/.rvm/gems/ruby-2.1.2/gems/sinatra-1.4.5/lib/sinatra/base.rb:966:in `[]' 
... 

Я не знаю, почему order_by не работает, Я попытался взглянуть на документы Mongoid, но не нашел ничего полезного для меня.

Edit:

К сожалению, я забыл упомянуть, я вложенный документ в Bin документе под названием Callback, с отношениями embeds_many :callbacks и embedded_in :bin, :inverse_of => :bins, поэтому я хотел, чтобы отсортировать callbacks документы в пределах одной конкретной bin основе на created_at.

+0

как предложил @basia я решил это, добавив 'order_by (created_at:«убывание»)' в 'для loop' на странице просмотра, что-то вроде '<% для обратного вызова в @ bin.callbacks.order_by (created_at:" desc ")%>'. – harshs08

ответ

2

после вопроса редактирования, это выглядит, как вы упускаете callbacks в этом запросе

@callbacks = Bin.find_by(bin_id: params[:bin_id]).callbacks.order_by(created_at: "desc") 
+0

Да, вы правы, я пропустил обратные вызовы в запросе. Я делал это, потому что мне приходилось отображать детали корзины вместе с деталями обратных вызовов в каждом ящике. Я решил это, добавив 'order_by (created_at:" desc ")' в 'for loop' на странице просмотра, что-то вроде' <% для обратного вызова в @ bin.callbacks.order_by (created_at: "desc")%> ' – harshs08

3

find_by возвращает один документ:

#find_by (ATTRS = {}) {| результат | ...} ⇒ Документ?

Найти первый документ с учетом условий.

и в документах нет order_by методов. Если вы хотите, чтобы найти все документы с этой bin_id затем использовать where:

@bins = Bin.where(bin_id: params[:bin_id]).order_by(:created_at.desc) 

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

+0

Я обновил свой вопрос, извините, что раньше не было ясно. – harshs08