Использование Ruby CSV создает записи Rails, в которых строковые поля не поддаются запросу

Я пытаюсь загрузить данные о семенах в мое приложение Rails из файла CSV. Сначала я установил гем fastercsv, только потом узнал, что fastercsv был устаревшим в пользу библиотеки CSV, начиная с версии ruby 1.9. Поэтому я перешел на CSV после того, как получил очень полезную ошибку, говорящую мне о необходимости перехода.

Теперь, однако, я столкнулся со странным явлением: когда я загружаю данные, все выглядит нормально, но я не могу сделать запрос к строковым полям. Строковые поля заполняются правильными строками, но я не могу получить к ним доступ. Я могу сделать запрос к любому из числовых полей, и результаты будут возвращены, но не к строковым полям. Я пробовал играть с разделителем для кавычек, но безрезультатно. Я даже удалил все кавычки из моего csv-файла, но все равно не смог выполнить запрос к строковым полям. Ниже приведен мой код и некоторые примеры запросов и возвратов из консоли Rails.

# seeds.rb
# ================

require 'csv'

directory = "db/init_data/"

file_name = "players.seed"
path_to_file = directory + file_name
puts 'Loading Player records'
# Pre-load All Player records
n=0
CSV.foreach(path_to_file) do |row|
  Player.create! :first_name => row[1], :last_name => row[2], :position_id => row[5], :weight => row[6], :height => row[7], :year => row[8], :home_state => row[9], :home_town => row[10], :home_country => row[11], :high_school_id => row[12], :name => row[13]      
n=n+1
end

Вот первые две записи из моего семенного файла.

# players.seed
"1","Allerik","Freeman","2011-10-11 22:21:21.230247","2011-10-11 22:21:21.230247","2","210","76","2013","NC","Charlotte","USA","1","Allerik Freeman"
"2","Kasey","Hill","2011-10-11 22:21:21.262409","2011-10-11 22:21:21.262409","1","170","73","2013","FL","Eustis","USA","2","Kasey Hill"

Вот что я получаю, когда захожу в консоль rails. Все работает нормально, если я хочу запросить число, например, год.

ruby-1.9.2-p290 :002 > Player.find_all_by_year(2013)
  Player Load (0.7ms)  SELECT "players".* FROM "players" WHERE "players"."year" = 2013
 => [#, #]

Но если я пытаюсь сделать запрос, скажем, по фамилии, я ничего не получаю, хотя он показывает, что фамилия присутствует в предыдущем запросе.

ruby-1.9.2-p290 :004 > Player.find_all_by_last_name("Freeman")
  Player Load (0.3ms)  SELECT "players".* FROM "players" WHERE "players"."last_name" = 'Freeman'
 => [] 

Единственный способ заставить его работать - поместить его в дополнительный набор двойных кавычек (экранированных), используя нотацию хэш-переменной, что позволило получить все мои строковые записи в базе данных в кавычках, затем я использовал команду delete, чтобы убрать кавычки обратно.

  n=0
  CSV.foreach(path_to_file) do |row|
    Player.create! :first_name => "\"#{row[1]}\"", :last_name => "\"#{row[2]}\"", :position_id => row[5], :weight => row[6], :height => row[7], :year => row[8], :home_state => "\"#{row[9]}\"", :home_town => "\"#{row[10]}\"", :home_country => "\"#{row[11]}\"", :high_school_id => row[12], :name => "\"#{row[13]}\""      
    n=n+1
  end
  puts "There\'s too many playas to hate, we just loaded #{n} of \'em"

  @players = Player.all
  @players.each do |player|
    fname = player.first_name
    player.first_name = fname.delete("\"")
    lname = player.last_name
    player.last_name = lname.delete("\"")
    pcity = player.home_town
    player.home_town = pcity.delete("\"")
    pst = player.home_state
    player.home_state = pst.delete("\"")
    pcountry = player.home_country
    player.home_country = pcountry.delete("\"")
    pname = player.name
    player.name = pname.delete("\"")
    player.save!
  end  

Затем я мог делать запросы к строковым данным.

ruby-1.9.2-p290 :005 > Player.find_all_by_last_name("Freeman")
  Player Load (0.6ms)  SELECT "players".* FROM "players" WHERE "players"."last_name" = 'Freeman'
 => [#, #] 

Очевидно, что это не лучший метод, так как он удваивает время загрузки, но я был на пределе своих возможностей.

Любая помощь будет очень признательна.

Как просили здесь, я добавил schema.rb

# schema.rb
# ===================
# encoding: UTF-8
# ...

ActiveRecord::Schema.define(:version => 20111007214728) do

#...

  create_table "players", :force => true do |t|
    t.string   "first_name"
    t.string   "last_name"
    t.datetime "created_at"
    t.datetime "updated_at"
    t.integer  "position_id"
    t.integer  "weight"
    t.integer  "height"
    t.integer  "year"
    t.string   "home_state"
    t.string   "home_town"
    t.string   "home_country"
    t.integer  "high_school_id"
    t.string   "name"
  end

# ...

end

Вот скриншоты базы данных, просмотренные моим SQLite Database Browser, как просили.

View of Player Table: Looks normal right?

No Rows Returned when querying a string field

Похоже, что есть похожая проблема здесь, на форумах ruby, и что это, вероятно, как-то связано с кодировкой, но мне нужно провести еще много исследований кодировки, чтобы выяснить это.

6
задан Joe Doyle 30 April 2012 в 01:11
поделиться