В настоящее время я создаю действие, которое принимает файл от пользователя и читает файл построчно.Каждая строка содержит несколько слов, разделенных запятой.Идея состоит в том, чтобы прочитать каждую строку, преобразовать строку в массив строк и затем обработать каждое слово индивидуально.
Я создал базовый класс Word, который имеет только идентификатор и значение.У меня также есть базовый класс под названием Synonym, который имеет идентификатор, значение и word_id для ссылки на слово.
При синтаксическом анализе слов я получаю исключение:
undefined method `to_f' for
#<Array:0x7ff6627074d8>
Этокод, вызывающий проблему для меня:
# Processes the uploaded file from the upload form and extracts
# all relevant information from the file to store it in the database
def process_upload
path = params[:file].tempfile.path
open(path).each do |line|
words = line.trim.split(',')
first_word = words.first
# Check if the word already exists as a synonym. If the word is a known synonym, save the
# remaining words as synonyms for the parent word. But only save these words if they don't
# exist yet
if !Synonym.find_by_value(first_word).blank?
parent_id = Synonym.find_by_value(first_word).word_id
words.each do |word|
Synonym.create(:value => word, :parent_id => parent_id) if Synonym.find_by_value(word).blank?
end
end
# Check if the first word is already known as a word inside the application. If the first word is already
# a known word, append all remaining words to the word as a synonym, but only if they don't exist yet.
if !Word.find_by_value(first_word).blank?
words.each do |word|
parent_id = Word.find_by_value(first_word).id
if (word != first_word) and Synonym.find_by_value(word).blank?
Synonym.create(:value => word, :parent_id => parent_id)
end
end
end
# The word is not a known synonym, and not a known word. Create the word in the database and
# append all remaining words to the database as synonyms.
word = Word.create(:value => first_word)
words.each do |w|
if w.eql? word.value
Synonym.create :value => w, :parent_id => word.id
end
end
end
end
Проблема возникает в последней части, Word.create (: value => first_word). Я получаю исключение, которое по какой-то причине пытается преобразовать его в число с плавающей точкой., но я понятия не имею, почему.
Схема миграции 'для обеих моделей:
class CreateWords < ActiveRecord::Migration
def self.up
create_table :words do |t|
t.string :value, :null => false
t.timestamps
end
end
def self.down
drop_table :words
end
end
class CreateSynonyms < ActiveRecord::Migration
def self.up
create_table :synonyms do |t|
t.integer :word_id, :null => false
t.string :value, :null => false
t.timestamps
end
end
def self.down
drop_table :synonyms
end
end
Чего мне не хватает?