2016-04-13 101 views
0

我正在構建一個類,該類將移除某個時間未更新的記錄。例如,我需要刪除過去8個月內未更新的所有記錄。我有一個工人類,看起來像這樣:這裏是否需要使用eval?

class ConnectionsCleanerWorker 
    include Sidekiq::Worker 

    sidekiq_options queue: :connections_cleaner, retry: false 

    def perform 
    months = Figaro.env.connection_updated_months_ago 
    Connection.where('updated_at < ?', eval("#{months}.months.ago")).destroy_all 
    end 
end 

它可以正常工作,但我不知道是否有任何的方式來編寫代碼,而無需使用eval

+1

'Connection.where('updated_at <?',months.months.ago).destroy_all' - 這應該很好。但是'months.months.ago'返回的是什麼? – dp7

+2

爲什麼你首先使用eval? – max

+1

@max,我假設爲插值'「#{months} .months.ago'。 – Uzbekjon

回答

2

不,你不需要它。你可以簡單地做:整數上的3.moths.ago。這意味着你可以簡單地做months.months.ago

period = Figaro.env.connection_updated_months_ago 
Connection.where('updated_at < ?', period.months.ago)).destroy_all 
1

如果monthsFixnum,它將在沒有eval的情況下工作。在其他情況下(month是一個字符串),最好做類似的操作:

def perform 
    months_count = Figaro.env.connection_updated_months_ago.to_i 
    Connection.where('updated_at < ?', months_count.months.ago)).destroy_all 
end 
+0

這是無效的。 – sawa

+0

@sawa,這是錯字,謝謝 – Ilya