2016-04-13 7 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' - これは正常に動作するはずです。しかし、月間はどうなるのでしょうか? – 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