Ошибка при попытке использовать новый интерфейс запросов Active Record в Rails 3 - PullRequest
1 голос
/ 18 ноября 2010

Я пытаюсь использовать новый интерфейс запросов Active Record для Rails 3.

Мой запрос в старом стиле

my_notes = Note.find(:all, :conditions => { :user_id => current_user.id, :date => p[:date] }, :order => "date ASC, created_at ASC")

В новом стиле я думал, что это будет:

my_notes = Note.find_all_by_user_id_and_date(current_user.id, p[:date]).order('date ASC, created_at ASC')

но я получаю эту ошибку:

NoMethodError in NotesController#play
undefined method `order' for #<Array:0x00000103d23c38>

Что я делаю не так? Спасибо за чтение.

Ответы [ 2 ]

6 голосов
/ 18 ноября 2010

find_all_by_<attritubte> не является частью нового синтаксиса ARel. Он немедленно выполняет запрос и возвращает массив с результатами. Поскольку запрос уже выполнен, вы не можете добавить к нему больше параметров, например order.

Попробуйте вместо этого:

Note.find.where(:user_id => current_user.id, :date => p[:date]).order('date ASC, created_at ASC')
4 голосов
/ 18 ноября 2010

Новый интерфейс запросов работает немного по-другому - find_all_by_user_id_and_date вернет массив результатов, тогда как order вернет объект ActiveRecord :: Relation, который затем можно будет расширить в дальнейшем.

Рабочий запрос будет

my_notes = Note.order('date ASC, created_at ASC').find_all_by_user_id_and_date(current_user.id, p[:date])

но обычно лучше использовать синтаксис AREL для вашего запроса:

my_notes = Note.where(:user_id => current_user.id, :date => p[:date]).order('date ASC, created_at ASC').all
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...