在Ruby中使用和编辑类变量?

时间:2012-07-19 15:15:17

标签: ruby-on-rails ruby sqlite

所以我对此事进行了几天的研究,而普遍的共识是没有一个。所以我希望得到一个更符合我情况的答案......

我使用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我需要一种方法来创建一个类变量,并且能够访问它,修改它并重新存储它。

修复好吗?谢谢!

1 个答案:

答案 0 :(得分:0)

这里有几个解决方案。从本质上讲,您需要保留一个变量:Postgres在数据库中提供了一个键/值存储,这是最理想的,但您使用的是SQLite,因此不适合您。相反,您可能需要使用redismemcached将此信息保存到您的数据库中。

任何一个允许您将值保存到无架构数据存储区中,稍后再次查询它们。 Redis具有保存到磁盘的优点,因此如果服务器出现故障,您可以在重新启动时再次获取md5的值。保存到memcached的数据永远不会保留,所以如果memcached实例消失,当它返回时,md5将再次为5。

redismemcached都得到了Ruby社区的大量支持。它会使您的堆栈稍微复杂一点,但我认为它是您可以使用的最佳解决方案。也就是说,如果您不能使用其中任何一个,您还可以将md5的值写入服务器上的临时文件,稍后再次访问它。问题在于,所有服务器进程都不会共享该值。

相关问题