繁体   English   中英

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

[英]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,因此这不是您的选择。 相反,您可能需要使用redismemcached将这些信息持久保存到数据库中。

任一种都可以使您将值持久存储到无模式的数据存储中,并在以后再次查询它们。 Redis具有保存到磁盘的优势,因此,如果服务器无法正常运行,则重新启动时可以再次获得md5的值。 保存到memcached中的数据永远不会持久保存,因此,如果memcached实例消失了,那么当它返回时,md5将再次为5。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM