簡體   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