【问题标题】:Show content based on holidays根据节假日显示内容
【发布时间】:2012-04-23 22:35:17
【问题描述】:
  • 红宝石 1.9.2p290
  • 导轨 3.1.1

我有这些模型:

class Recipe < ActiveRecord::Base
 belongs_to :festivity 
end

class Festivity < ActiveRecord::Base
 has_many :recipes 
end

我在“食谱”表中有以下字段:

festivity_id

以及“庆祝活动”表中的以下日期时间字段:

starts_at
ends_at

如何根据节日日期显示内容?

我开始以这种静态方式思考:

class PagesController < ApplicationController
 def home
  @recipes_by_festivities = Recipe.where(:festivity_id => 4).all(:order => 'RAND()', :limit => 8)
 end
end

例如:在圣诞节期间(大约整个 12 月),我想显示一个 festivity_id = 1 的食谱列表。在感恩节期间,我只想显示一个 festivity_id = 4 的食谱列表。

我说清楚了吗?如果我没有,请告诉我。

解决方案

@current_festivity = Festivity.find(:last, :conditions => ["? between starts_at AND ends_at", Time.utc(0,Time.now.month,Time.now.day,0,0,0)])

@recipes_by_festivities = Recipe.where(:festivity_id => @current_festivity).all(:order => 'RAND()', :limit => 8)

【问题讨论】:

  • @festivity = Festivity(100);@festivity.recipies.where(:order => 'RAND()', :limit => 8) 应该可以。但我不明白你所说的日期范围是什么意思。您是在谈论基于开始日期或结束日期等列的分页和排序
  • 你的问题不够清楚,无法理解你真正想要什么。你想要食谱或庆祝活动?并希望吗?
  • 对不起我的英语。例如:在圣诞节,我想展示 festivity_id = 1 的食谱。在感恩节,我只想展示 festivity_id = 4 的食谱。

标签: ruby-on-rails ruby ruby-on-rails-3 datetime


【解决方案1】:

我要做的是在庆祝活动表中创建一个“名称”字段,然后使用holidays gem 来确定特定日期是否有假期。

Holdays.on(Date.today)

这将返回一个哈希列表:每个哈希都有一个名称键。然后您可以使用它来查找正确的 Festivity 对象 current_festival = Festivies.where(:name =&gt; Holdays.on(Date.today)[0][:name]) 并从那里获取食谱:current_festival.recipes

【讨论】:

  • 感谢您的回答!我不知道假期宝石。看起来很有趣!我也会尝试,但我正在寻找没有宝石的解决方案。但这似乎真的很有趣。谢谢!
【解决方案2】:

这假定 starts_at 和 ends_at 与同一年 (0) 一起保存,除非期间在两年中间(例如圣诞节):在这种情况下,ends_at 年必须是 1。

Festivity.create(name: 'Christmas time', starts_at: Time.utc(0,12,25,0,0,0), ends_at: Time.utc(1,1,6,23,59,59))
Festivity.create(name: 'Ferragosto', starts_at: Time.utc(0,8,15,0,0,0), ends_at: Time.utc(0,8,15,23,59,59))

Recipe.create(festivity: Festivity.find_by_name('Periodo natalizio'))
Recipe.create(festivity: Festivity.find_by_name('Ferragosto'))

# Searching for festivities today
Recipe.includes(:festivity).where(['? BETWEEN festivities.starts_at AND festivities.ends_at', Time.utc(0,Time.now.month,Time.now.day,12,0,0)]).all
# Searching for festivities on 15 August (in Italy there is a festivity that is called Ferragosto)
Recipe.includes(:festivity).where(['? BETWEEN festivities.starts_at AND festivities.ends_at', Time.utc(0,8,15,12,0,0)]).all
# Searching for festivities on 28 December
Recipe.includes(:festivity).where(['? BETWEEN festivities.starts_at AND festivities.ends_at', Time.utc(0,12,28,12,0,0)]).all

这是一个功能的可能实现:

def recipes_on(day, month)
  Recipe.includes(:festivity).where(['? BETWEEN festivities.starts_at AND festivities.ends_at', Time.utc(0,month,day,12,0,0)]).all
end

【讨论】:

  • 非常感谢!我将立即尝试此解决方案并给您反馈。
  • 如果我的回答能回答你的问题,记得给我投票;)
  • 我没有得到正确的结果。今天搜索庆祝活动给我带来了 3 个庆祝活动,而结果肯定只有一个。例如:今天(4 月 25 日)是巴西母亲节的中间(starts_at:4 月 9 日,ends_at:5 月 13 日)。但结果显示另外 2 个:狂欢节(starts_at:1 月 2 日,ends_at:2 月 22 日)和复活节(starts_at:2 月 23 日,ends_at:4 月 8 日)
  • O.O 它必须工作,它只是 SQL! :) 你能写出 Rails 运行代码时生成的 SQL 吗?
  • 还有一个性能问题。这是最好的方法吗?生成的sql太长了,放不下。这是一份简历:SQL (140.4ms) SELECT recipes.id AS t0_r0, recipes.name AS t0_r1, recipes.description AS t0_r2 ...festivities.starts_at AS t1_r4, festivities.ends_at AS t1_r5 ... FROM recipes LEFT OUTER JOIN festivities ON festivities.id = recipes.festivity_id WHERE recipes.status_id = 1 AND ('0000-04-26 12:00:00' BETWEEN festivities.starts_at AND festivities.ends_at) ORDER BY RAND() LIMIT 8
【解决方案3】:

由于您想按节日查找食谱,您可以这样做:

def home
  festivity_today = some_custom_festivity_lookup(Time.now)
  if !festivity_today.nil?
    @recipes = Recipe.where(festivity_id: festivity_today.id).limit(8)
  else
    @recipes = Recipe.limit(8)
  end
end

【讨论】:

  • “festivity_id”必须是基于假期日期的动态。例如:在圣诞节,我想展示 festivity_id = 1 的食谱。在感恩节,我只想展示 festivity_id = 4 的食谱。
  • 数字 10 仅用于说明。您可以先根据今天的日期进行一些自定义查找,然后使用它来查找食谱,从而找到节日 -id。相应地更新了答案。
  • 萨利尔,感谢您的回答!但实际上我想要的正是“some_custom_festivity_lookup”。怎么做?我是 Ruby/Rails 的新手。
猜你喜欢
  • 1970-01-01
  • 2011-08-18
  • 2013-07-18
  • 2014-08-13
  • 1970-01-01
  • 2015-08-20
  • 1970-01-01
  • 1970-01-01
  • 2014-11-13
相关资源
最近更新 更多