轨道上的红宝石 - 如何在时间表达式中使用像"day, month, year"这样的字符串变量"1.VARIABLE.ago"?



我有一个参数就像params[:time_range]

在我的控制器中,我想使用这个时间范围参数在我的查询中指定一个特定的范围如下所示:

# params[:time_range] = "week"
time = params[:time_range]
query = Article.where(created_at: 1.#{time}.ago)

现在这样肯定不行。

是否有方法将params[:time_range]字符串转换为月,日或周的类型?

我试图使用to_sym,但week的东西不是一个符号。当我试图找到它的类与1.week我得到Fixnum

有人知道解决这个问题的方法吗?

使用send动态调用ruby中的方法。

1.send(time).ago

但是要小心,你的用户可以用你这样做的方式调用对象上的任何方法,你应该在此之前对它进行消毒。

的例子:

time = 'day' unless ['day', 'month', 'year', 'week'].include? time

最新更新