You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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任务重复拉取相同新闻:
    rails generate migration AddUniqueIndexToNewsEntries guid
    # 编辑迁移文件,添加唯一约束:
    add_index :news_entries, :guid, unique: true
    
    然后在Rake任务里先检查是否存在,再创建:
    def 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 03:40:52