Rails:比较3个日期

时间:2016-01-13 10:19:07

标签: ruby-on-rails

我希望仅在广告系列处于活动状态时才会在下拉列表中显示广告系列。广告系列模型具有valid_from和valid_until列(两个日期)。现在,我只想在Date.today介于valid_from和valid_until之间时才显示广告系列。例如。 valid_from: "12-13-2015" valid_until: "12-17-2015"让我们说Date.today is 12-14-2015

代码(现在不能正常工作):

<% Brand.all.each do |b| %>
  <%= f.collection_select(:campaign, Campaign.where(brand: b.company).where('valid_from' && 'valid_until' < Date.today), :campaign, :campaign, {prompt:true}, {class: 'form-control'}) %>
<% end %>

预期结果是,只有在这两个日期之间“活动”时,广告系列才会显示。

任何想法如何解决这个问题?

提前致谢!

2 个答案:

答案 0 :(得分:2)

你的问题是这个的语法和逻辑都是错误的:

.where('valid_from' && 'valid_until' < Date.today)

这里有两个单独的测试。

将其更改为

.where('valid_from <= ? and valid_until >= ?', Date.today, Date.today)

您也可以将其与品牌测试结合起来:

  <%= f.collection_select(:campaign, Campaign.where('brand = ? and valid_from <= ? and valid_until >= ?', b.brand, Date.today, Date.today), :campaign, :campaign, {prompt:true}, {class: 'form-control'}) %>

答案 1 :(得分:2)

试试这个:

(valid_from..valid_until).cover?(Date.today)

或者,如果你想保持自己的风格,那就:

.where('valid_from <= ? AND valid_until >= ?', Date.today, Date.today)