2010-11-18 4 views
1

Je suis en train d'utiliser le new Active Record Query Interface pour Rails 3.Erreur lors de la tentative d'utiliser la nouvelle interface de requête Active Record dans Rails 3

Mon ancienne requête de style est

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

Dans le nouveau style, Je pensais que ce serait:

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

mais j'obtenir cette erreur:

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

Qu'est-ce que je fais mal? Merci d'avoir lu.

+1

Il semble que 'find_all' retourne un tableau. Peut-être que vous pouvez passer à 'where'? –

Répondre

4

La nouvelle interface de requête fonctionne un peu différemment - find_all_by_user_id_and_date retourne un tableau de résultats, alors que order retourne un objet ActiveRecord :: Relation qui peut ensuite être scope.

Une requête de travail serait

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

mais il serait généralement préférable d'utiliser la syntaxe AREL pour votre requête:

my_notes = Note.where(:user_id => current_user.id, :date => p[:date]).order('date ASC, created_at ASC').all 
+0

C'est ce que j'ai dit :) – Ariejan

+0

@Ariejan Pas au moment où j'ai posté ma réponse ce n'était pas, vous avez ajouté des informations supplémentaires après avoir posté. – nobody

+0

Eh bien, grands esprits :) – Ariejan

6

find_all_by_<attritubte> ne fait pas partie de la nouvelle syntaxe ARel. Il exécute la requête immédiatement et renvoie un tableau avec les résultats. Étant donné que la requête a déjà été exécutée, vous ne pouvez plus ajouter d'autres options, telles que order.

Essayez ceci:

Note.find.where(:user_id => current_user.id, :date => p[:date]).order('date ASC, created_at ASC') 
Questions connexes