0

テキストファイルをアップロードしてから、そのファイル名、content_type、およびデータをDBテーブルに保存するアプリがあります。

これはすべてうまく機能しますが、ファイルを単語に分割し、単語を文字に分割し、アルファベット順に並べ替えてから再度結合するメソッドを作成しようとしています。その間、並べ替えられた文字をキーとしてハッシュに入力します。文字が値として表す単語で。

"denoops"=>[" snooped", "spooned"]

これは小さいファイルでは機能しますが、300,000語程度の大きいファイルを解析すると、すべてのデータがハッシュに入力されますが、次のエラーでエラーが発生します。

expected SCALAR, SEQUENCE-START, MAPPING-START, or ALIAS

これがコードです。注更新データをハッシュとしてデータベースに保存するシリアル化を追加し、列タイプをバイナリからテキストに変更しました。

attachment.rb:

 class Attachment < ActiveRecord::Base
    has_many :anagrams, dependent: :destroy
    attr_accessible :filename, :content_type, :data
    validates_presence_of :filename, :data
    serialize :data, Hash


    def uploaded_file=(incoming_file)
      self.filename = incoming_file.original_filename
      self.content_type = incoming_file.content_type
      results = {}

      incoming_file.read.downcase.split.each do |word|
        letters = word.split('').sort
        results[letters.join] = [[results[letters]].join(" ")] << word
        end
      self.data = results
    end

Railsエラーログ:

 Started POST "/attachments" for 127.0.0.1 at 2012-08-20 17:10:09 +0100
Processing by AttachmentsController#create as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"y2S3Z6Yg9iuU74to7ZEDUedlCEsazEU26mIrsnNxgmQ=", "attachment"=>#<ActionDispatch::Http::UploadedFile:0x007f8a411497b8 @original_filename="medium_word_list.90", @content_type="application/octet-stream", @headers="Content-Disposition: form-data; name=\"attachment\"; filename=\"medium_word_list.90\"\r\nContent-Type: application/octet-stream\r\n", @tempfile=#<File:/var/folders/1g/d9qbm7_s0_5fcljtvzysp1gc0000gn/T/RackMultipart20120820-3535-119x9hk>>, "commit"=>"upload"}
   (0.1ms)  begin transaction
   (0.1ms)  rollback transaction
Completed 500 Internal Server Error in 11177ms

RuntimeError (expected SCALAR, SEQUENCE-START, MAPPING-START, or ALIAS):
  app/controllers/attachments_controller.rb:21:in `create'

添付ファイルテーブルの移行を作成します。

class CreateAttachments < ActiveRecord::Migration
  def up
    create_table :attachments do |t|
      t.string :filename
      t.string :content_type
      t.text :data
    end
  end

Googleからはあまりありません。誰かがもっとコードが必要な場合は、ただ言ってください。

4

1 に答える 1

1

メソッドのリファクタリングと再構築を少し行うと、uploaded_file=次のようになります。

def uploaded_file=(incoming_file)
  self.filename = incoming_file.original_filename
  self.content_type = incoming_file.content_type
  results = {}

  incoming_file.read.downcase.split.each do |word|
    letters = word.split('').sort
    results[
      letters
    ] = [
      [
        results[
          letters
        ]
      ].join(" ")
    ] << word 
  end

  self.data = results
end

ハッシュへの割り当てresultsは疑わしいようです。配列をハッシュキーとして割り当てています。次に、それを保存しようとします。問題はその配列をキーとして使用していることだと思います。代わりにこれを試してください:

results[
  letters.join
] = [
于 2012-08-20T13:25:11.283 に答える