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
ç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