0

所以我对这个问题做了几天的研究,普遍的共识是没有。所以我希望得到一个更具体的我的情况的答案......

我正在使用 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

但这种变化并没有承诺任何事情。一旦我退出控制台,事情就会再次回到“5”。这几乎就像我的班级需要一个 .save 方法。

此外,在 rake 文件中,您会看到我有两个打印语句,在解析之前和之后打印出 Issue.md5。第一个打印出“5”,第二个打印出新的正确哈希。所以 Ruby 认识到我正在更改这个变量,它从未保存在任何地方。

Ruby 1.9.3、Rails 3.2.6、SQLite3 3.6.20。

tl;博士我需要一种方法来创建一个类变量,并且能够访问它、修改它并重新存储它。

请问修复?谢谢!

4

1 回答 1

0

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

任何一个都允许您将值持久保存到无模式数据存储中,并在以后再次查询它们。Redis 的优点是可以保存到磁盘,所以如果服务器对你不满意,你可以在重新启动时再次获取 md5 的值。保存到 memcached 中的数据永远不会持久化,因此如果 memcached 实例消失,当它回来时 md5 将再次为 5。

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

于 2012-07-19T15:32:04.620 回答