2010-06-21 4 views
1

Je teste Rails 3 beta 4 sur Ruby 1.9.2-tête, et quand je commence une console et faire:erreur avec "to_sql" on Rails 3 Beta 4

Game.first.to_sql 

Je reçois cette erreur :

ArgumentError: wrong number of arguments (0 for 1) 

Je sais qu'il peut trouver l'enregistrement du jeu, parce que quand je tape:

Game.first 

retourne:

=> #<Game id: 1, name: "Galaga", created_at: "2010-06-19 11:02:37", 
updated_at: "2010-06-19 11:02:37"> 

Que manque-t-il? Je veux juste que le to_sql fonctionne dans un cas très simple: .

.

Répondre

2

Lorsque vous exécutez Game.first, vous renvoyez un objet Game, pas un objet ActiveRecord::Relation comme vous vous y attendez.

Pour faire ce que vous essayez de faire, vous devez faire:

Game.limit(1).to_sql 

Cela vous permet d'exécuter comme vous l'attendiez sans to_sql et retourner l'objet, bien qu'il soit dans un tableau, qui alors vous pouvez exécuter .first dessus comme vous le vouliez de toute façon.

irb(main):004:0> Game.limit(1).to_sql 
=> "SELECT `games`.* FROM `games` LIMIT 1" 
irb(main):005:0> Game.limit(1).class 
=> ActiveRecord::Relation 
irb(main):006:0> Game.limit(1) 
=> [#<Game id: 1, name: "Galaga", created_at: "2010-06-19 11:02:37", updated_at: "2010-06-19 11:02:37">] 
irb(main):007:0> Game.limit(1).first 
=> #<Game id: 1, name: "Galaga", created_at: "2010-06-19 11:02:37", updated_at: "2010-06-19 11:02:37"> 

Lorsque vous creusez dans la source, lorsque vous exécutez .first sur un ActiveRecord :: Relation il court le suivant (qui est la même chose que je vous ai montré):

def find_first 
    if loaded? 
    @records.first 
    else 
    @first ||= limit(1).to_a[0] 
    end 
end 
+0

ça marche! J'avais peur que ma machine dev ne soit pas configurée correctement avec Rails ou Ruby. Comme si un module manquait ou quelque chose. Je ne vois pas que je le faisais mal. Maintenant, je dois comprendre les différences entre une définition de requête et le modèle qui en découle. J'y arriverai. Merci pour l'aide. – MattSlay