Я тестирую направляющие 3 беты 4 на Ruby, с 1.9.2 головами, и когда я запускаю консоль и делаю:
Game.first.to_sql
Я получаю эту ошибку:
ArgumentError: wrong number of arguments (0 for 1)
Я знаю, что это может найти Игровую запись, потому что, когда я ввожу:
Game.first
это возвращается:
=> #<Game id: 1, name: "Galaga", created_at: "2010-06-19 11:02:37",
updated_at: "2010-06-19 11:02:37">
Что я пропускаю? Я просто хочу заставить to_sql работать в очень простом случае.
.
Когда вы выполняете Game.first
, вы возвращаете объект Game
, а не объект ActiveRecord::Relation
, как вы ожидаете.
Чтобы сделать то, что вы пытаетесь сделать, вам нужно сделать:
Game.limit(1).to_sql
Это позволит вам запустить его без to_sql
и вернуть объект, как вы ожидали, хотя он будет в массиве, который затем вы можете выполнить .first
на нем, как вы хотели в любом случае.
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">
Когда вы копаетесь в источнике, когда вы выполняете . first
на ActiveRecord::Relation выполняется следующее (то же самое, что я вам показал):
def find_first
if loaded?
@records.first
else
@first ||= limit(1).to_a[0]
end
end