0

そこで、私はこの問題について数日分の調査を行いましたが、一般的なコンセンサスは、1 つも存在しないということです。だから私は自分の状況にもっと具体的な答えを望んでいました...

Rails を使用してファイルをデータベースにインポートしています。インポートに関してはすべて機能していますが、すべてのエントリだけでなく、データベース自体に属性を与えたいと考えています。ファイルのハッシュを作成していますが、それをデータベース (またはクラス) に割り当てるのが最も簡単だと考えました。

各エントリがいくつかの属性を持つ Issue という名前のクラス (つまり「issues」データベース) を作成しました。単純にハッシュを保存するために、Issue にクラス変数 (少なくとも、それが最善の選択肢だと思います) を追加する方法を見つけたかったのです。新しいファイルがインポートされた以前のファイルと異なる場合は、ファイルをインポートするためのレーキを作成しました(ハッシュが異なる場合は読み取ります)。

desc "Parses a CSV file into the 'issues' database"
task :issues, [:file] => :environment do |t, args|
  md5 = Digest::MD5.hexdigest(args[:file])
  puts "1: Issue.md5 = #{Issue.md5}"

  if md5 != Issue.md5
    Issue.destroy_all()
    #import new csv file
    CSV.foreach(args[:file]) do |row|

      issue = {
        #various attributes to be columns...
        }
      Issue.create(issue)
   end #end foreach loop
  Issue.md5 = md5
  puts "2: Issue.md5 = #{Issue.md5}"
  end #end if statement
end #end task

そして、私のモデルは次のとおりです。

class Issue < ActiveRecord::Base

  attr_accessible :md5

  @@md5 = 5

  def self.md5
    @@md5
  end

  def self.md5=(newmd5)
    @@md5 = newmd5
  end

  attr_accessible #various database-entry attributes
end

私は自分のモデルを書くためにさまざまな方法を試しましたが、すべてこれに行き着きます。モデルに @@md5 を設定すると、ほとんど定数のように永続的な変更になります。ここでこの値を変更してデータベースを更新すると、変更がすぐに記録されます。Rails コンソールに移動して実行すると、次のようになります。

Issue.md5        # => 5
Issue.md5 = 123  # => 123
Issue.md5        # => 123

しかし、この変更は何にもコミットされていません。コンソールを終了するとすぐに、再び「5」に戻ります。クラスに .save メソッドが必要なようです。

また、rake ファイルには、解析の前後に Issue.md5 を出力する 2 つの print ステートメントがあることがわかります。1 つ目は「5」を出力し、2 つ目は新しい正しいハッシュを出力します。したがって、Ruby は、私がこの変数を変更しているという事実を認識しており、どこにも保存されていません。

Ruby 1.9.3、Rails 3.2.6、SQLite3 3.6.20。

tl;dr クラス変数を作成し、それにアクセスして変更し、復元できるようにする方法が必要です。

修正してください?ありがとう!

4

1 に答える 1

0

ここにはいくつかの解決策があります。基本的に、その 1 つの変数を永続化する必要があります。Postgres はデータベースにキー/値ストアを提供します。これが最も理想的ですが、SQLite を使用しているため、これはオプションではありません。代わりに、おそらくredisまたはmemcachedを使用して、この情報をデータベースに永続化する必要があります。

いずれの方法でも、スキーマのないデータストアに値を保持し、後で再度クエリを実行できます。Redis にはディスクに保存されるという利点があるため、サーバーが異常終了した場合は、再起動時に md5 の値を再度取得できます。memcached に保存されたデータは永続化されないため、memcached インスタンスがなくなった場合、戻ってきたときに md5 は再び 5 になります。

redismemcachedはどちらも、Ruby コミュニティで多くのサポートを受けています。スタックのインストールが少し複雑になりますが、利用可能な最良のソリューションだと思います。つまり、どちらも使用できない場合は、サーバー上の一時ファイルに md5 の値を書き込んで、後で再度アクセスすることもできます。問題は、その値がすべてのサーバー プロセス間で共有されないことです。

于 2012-07-19T15:32:04.620 に答える