В чем разница между этими двумя реализациями функции Ruby? - PullRequest
2 голосов
/ 29 марта 2012

1)

require 'sqlite3'

db = SQLite3::Database.new('development.sqlite3')
db.results_as_hash = true;


rows = db.execute(" SELECT * FROM listings WHERE name = '' OR telephone = '' OR latitude = '' OR longitude = '' ")

rows do |row|

  id_num = row['id']
  puts "Id = #{id_num}"

  dupe_name = row['name']
  puts "name = #{dupe_name}"

  dupe_tel = row['telephone']
  puts "tel = #{dupe_tel}"

  dupe_lat = row['latitude']
  puts "lat = #{dupe_lat}" 

  dupe_long = row['longitude']
  puts "lat = #{dupe_long}" 
  puts '===end===='



end

2)

    require 'sqlite3'

db = SQLite3::Database.new('development.sqlite3')
db.results_as_hash = true;


db.execute(" SELECT * FROM listings WHERE name = '' OR telephone = '' OR latitude = '' OR longitude = '' ") do |row|

  id_num = row['id']
  puts "Id = #{id_num}"

  dupe_name = row['name']
  puts "name = #{dupe_name}"

  dupe_tel = row['telephone']
  puts "tel = #{dupe_tel}"

  dupe_lat = row['latitude']
  puts "lat = #{dupe_lat}" 

  dupe_long = row['longitude']
  puts "lat = #{dupe_long}" 
  puts '===end===='



end

Второй работает, а первый - нет.

Почему это так? Разве функция db.execute не возвращает набор результатов. Если так, то почему вы не можете пройти через это?

1 Ответ

4 голосов
/ 29 марта 2012

Вы пытались изменить rows do |row| на rows.each do |row| для первой функции ?.

С первым вы получаете коллекцию и присваиваете ей rows. После этого вам нужно создать итератор для строк, чтобы выполнить цикл по коллекции.

Вторая функция, execute уже возвращает итератор.

Подробнее об итераторах

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...