[英]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.