そこで、私はこの問題について数日分の調査を行いましたが、一般的なコンセンサスは、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 クラス変数を作成し、それにアクセスして変更し、復元できるようにする方法が必要です。
修正してください?ありがとう!