неожиданный вызов to_f - PullRequest
       2

неожиданный вызов to_f

1 голос
/ 11 апреля 2011

В настоящее время я создаю действие, которое принимает файл от пользователя и читает файл построчно.Каждая строка содержит несколько слов, разделенных запятой.Идея состоит в том, чтобы прочитать каждую строку, преобразовать строку в массив строк и затем обработать каждое слово индивидуально.

Я создал базовый класс 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

Чего мне не хватает?

1 Ответ

2 голосов
/ 12 апреля 2011

Что касается приведенных выше комментариев, я выяснил, что было причиной этого:

Если вы полагаетесь на гем Classifier из rubyforge или rubygems, он перезапишет метод Array # sum. Поскольку эти драгоценные камни загружаются ПОСЛЕ загрузки рельсов, они перезаписывают этот метод также для ActiveRecord, что приводит к ошибкам.

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

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