2012-12-09 58 views
0

我不確定這裏發生了什麼。我需要在兩個時間變量上運行字符串比較。一個變量是使用.mtime函數的Time對象。另一個變量來自sqlite3數據庫。我想比較這些時間,看看修改日期是否與sqlite3表中列出的最後修改日期不同。這是該部分的代碼。Ruby中的字符串比較不起作用

當我打印出來的價值觀,他們看起來一樣......那麼,爲什麼不比較工作

def scanfile 
    dir = Dir.new(Dir.pwd) 
    dir.each do |file| 
    fileName = File.basename(file) 
    modTime = File.mtime(file).strftime("%F %T") 
    lastMod = nil 
    exists = checkDB(fileName) 
    if exists == true 
     $db.execute("SELECT DateMod FROM Files WHERE fileName = '#{fileName}'") do |mod| 
     lastMod = mod 
     end 
     mod = modTime.to_s 

     printf("modTime: #{mod} lastMod: #{lastMod}\n") 
     if mod != lastMod 
     $db.execute("UPDATE Files SET NumMods=NumMods+1 WHERE fileName = '#{fileName}'") 
     $db.execute("UPDATE Files SET DateMod='#{modTime}' WHERE fileName = '#{fileName}'") 
     print "#{fileName} updated...\n" 
     end 
    else 
     if fileName != "." && fileName != ".."  
     inputRecord(fileName, modTime, modTime, 1) 
     print "#{fileName} inserted...\n" 
     end 
    end 
    end 
end 
+0

有幾件事情你可以做自己節省了大量的工作。首先,使用ORM,如Sequel,Datamapper或ActiveRecord來抽象你的數據庫連接。其中的值是您的日期,日期時間和時間字段將被抽象,以便您可以對它們執行簡單的日期,日期時間或時間數學。另一個主要好處是轉換到不同的DBM將是容易的。 –

回答

0

好吧,我想通了。我不知道爲什麼,這固定它,因爲我認爲我基本上是這樣做,但使用:

if !modTime.to_s.eql? lastMod.to_s 

制定好..

1

當您使用execute(或this version),你將要使用結果集的行作爲字符串數組,而不是簡單的字符串。所以在這裏:

$db.execute(...) do |mod| 
    #... 
end 

你的mod將是一個包含單個字符串的數組。問題在於你保存該數組並將其當作字符串對待;有足夠的to_s調用和類似的修改,你會得到一個字符串,看起來是正確的,你和Ruby,一切都會工作。

你應該自己解壓排陣:

$db.execute(...) do |mod| 
    lastMod = mod.first 
    # ------------^^^^^ 
end