Rails+Feedjira:如何从指定日期获取Feed条目?
嘿,你这套资讯板块的架构已经很完整了!针对你要获取指定日期NewsEntry的需求,我给你几个实用的实现方案,都是Ruby on Rails里常用的套路:
1. 确保模型有正确的日期字段
首先得确认你的NewsEntry模型存储了新闻的发布日期——Feedjira拉取的条目本身就带有published属性,所以我们要把它存到数据库里:
- 如果还没加这个字段,先跑个迁移:
rails generate migration AddPublishedAtToNewsEntries published_at:datetime rails db:migrate - 然后在拉取Feed的逻辑里(比如你的Rake任务),把Feedjira返回的发布时间赋值给
published_at:# 示例:Rake任务里的创建逻辑 NewsEntry.create!( title: entry.title, url: entry.url, published_at: entry.published, # 如果需要时区转换,就用entry.published.in_time_zone(Rails.config.time_zone) # 其他字段... )
2. 给模型添加日期查询的Scope
为了让查询更优雅、复用性更高,在NewsEntry模型里加个Scope:
class NewsEntry < ApplicationRecord # 查询指定日期的所有新闻(精确到当天的00:00到23:59:59) scope :on_date, ->(target_date) { where(published_at: target_date.beginning_of_day..target_date.end_of_day) } # 可选:如果要支持查询某段时间范围,再加个Scope scope :between_dates, ->(start_date, end_date) { where(published_at: start_date.beginning_of_day..end_date.end_of_day) } end
这样调用起来就超方便:
- 获取今天的新闻:
NewsEntry.on_date(Date.today) - 获取指定日期(比如2024年5月20日):
NewsEntry.on_date(Date.parse("2024-05-20")) - 获取近7天的新闻:
NewsEntry.between_dates(7.days.ago.to_date, Date.today)
3. 在Dashboard控制器里使用查询逻辑
根据你的需求,在DashboardController#index里获取指定日期的新闻,比如:
def index # 默认展示当天的3条最新新闻 target_date = params[:selected_date] ? Date.parse(params[:selected_date]) : Date.today @featured_news = NewsEntry.on_date(target_date) .order(published_at: :desc) # 按发布时间倒序,最新的在前 .limit(3) end
如果需要让用户手动选择日期,只要在视图里加个日期选择器,把选中的日期通过params传到控制器就行。
4. 额外优化:避免重复数据+时区处理
- 去重:给
NewsEntry加个唯一索引(比如基于新闻的guid或url),防止Rake任务重复拉取相同新闻:
然后在Rake任务里先检查是否存在,再创建:rails generate migration AddUniqueIndexToNewsEntries guid # 编辑迁移文件,添加唯一约束: add_index :news_entries, :guid, unique: truedef self.update_from_feed(feed_url) feed = Feedjira::Feed.fetch_and_parse(feed_url) feed.entries.each do |entry| next if NewsEntry.exists?(guid: entry.id) # 创建逻辑... end end - 时区:如果你的应用有时区设置(比如
config.time_zone = 'Beijing'),记得把Feedjira返回的UTC时间转成应用时区,避免查询日期时出现偏差:published_at: entry.published.in_time_zone(Rails.application.config.time_zone)
这样就能完美实现“获取指定日期NewsEntries”的需求啦!
内容的提问来源于stack exchange,提问作者VegaStudios
相关产品推荐
相关产品推荐

