[英]Using and Editing Class Variables in Ruby?
因此,我已经就此事进行了为期两天的研究,并且普遍的共识是没有一个。 所以我希望能得到一个更具体的答案……
我正在使用Rails将文件导入数据库。 一切都与导入有关,但是我想给数据库本身一个属性,而不仅仅是每个条目。 我正在创建文件的哈希,我认为将其分配给数据库(或类)是最简单的。
我创建了一个名为Issue的类(因此是一个“问题”数据库),每个条目都有几个属性。 我想找到一种向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。 第一个打印出“ 5”,第二个打印出正确的新哈希。 因此Ruby意识到我正在更改此变量,但它从未保存在任何地方。
Ruby 1.9.3,Rails 3.2.6,SQLite3 3.6.20。
tl; dr我需要一种创建类变量的方法,并能够访问,修改和重新存储它。
修复好吗? 谢谢!
这里有一对夫妇的解决方案。 本质上,您需要保留一个变量:Postgres在数据库中提供键/值存储,这是最理想的,但是您使用的是SQLite,因此这不是您的选择。 相反,您可能需要使用redis或memcached将这些信息持久保存到数据库中。
任一种都可以使您将值持久存储到无模式的数据存储中,并在以后再次查询它们。 Redis具有保存到磁盘的优势,因此,如果服务器无法正常运行,则重新启动时可以再次获得md5的值。 保存到memcached中的数据永远不会持久保存,因此,如果memcached实例消失了,那么当它返回时,md5将再次为5。
redis和memcached都在Ruby社区中获得了很多支持。 这会使您的堆栈稍微复杂一点,但只需安装一个即可,但是我认为这是为您提供的最佳解决方案。 就是说,如果您不能使用任何一个,也可以将md5的值写入服务器上的一个临时文件,然后稍后再次访问它。 那里的问题是,该值将不会在所有服务器进程之间共享。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.