所以我对此事进行了几天的研究,而普遍的共识是没有一个。所以我希望得到一个更符合我情况的答案......
我使用Rails将文件导入数据库。一切都在导入,但我想给数据库本身一个属性,而不仅仅是每个条目。我正在创建文件的哈希,我认为将它分配给数据库(或类)是最容易的。
我创建了一个名为Issue的类(因此是一个' issue'数据库),每个条目都有一些属性。我想要找出一种方法来添加一个类变量(至少,我认为这是最好的选择)来发布简单存储哈希。我已经写了一个rake来导入文件,如果新文件与导入的前一个文件不同(读取,如果哈希值不同)。
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
但是这种变化并没有发生在任何事情上。一旦我退出控制台,事情就会回到&#34; 5&#34;再次。这几乎就像我需要一个.save方法一样。
另外,在rake文件中,你看到我有两个print语句,在解析之前和之后打印出Issue.md5。第一个打印出&#34; 5&#34;第二个打印出新的,正确的哈希值。因此,Ruby认识到我正在改变这个变量这一事实,它从未在任何地方保存过。
Ruby 1.9.3,Rails 3.2.6,SQLite3 3.6.20。
tl; dr我需要一种方法来创建一个类变量,并且能够访问它,修改它并重新存储它。
修复好吗?谢谢!
答案 0 :(得分:0)
这里有几个解决方案。从本质上讲,您需要保留一个变量:Postgres在数据库中提供了一个键/值存储,这是最理想的,但您使用的是SQLite,因此不适合您。相反,您可能需要使用redis或memcached将此信息保存到您的数据库中。
任何一个允许您将值保存到无架构数据存储区中,稍后再次查询它们。 Redis具有保存到磁盘的优点,因此如果服务器出现故障,您可以在重新启动时再次获取md5的值。保存到memcached的数据永远不会保留,所以如果memcached实例消失,当它返回时,md5将再次为5。
redis和memcached都得到了Ruby社区的大量支持。它会使您的堆栈稍微复杂一点,但我认为它是您可以使用的最佳解决方案。也就是说,如果您不能使用其中任何一个,您还可以将md5的值写入服务器上的临时文件,稍后再次访问它。问题在于,所有服务器进程都不会共享该值。