Rails范围在月内创建

时间:2014-04-23 13:12:27

标签: ruby-on-rails ruby postgresql date

我在编写模型范围时遇到了一些问题。我想基于它们发布的月份来过滤我的模型对象,即模型BlogPost:

scope :published_in_month, ->(date) { where(published_date: date.at_beginning_of_month..date.at_end_of_month) }

所以这是我的控制器方法:

def list_by_month
    @date = Time.parse("#{params[:year]}/#{params[:month]}")
    puts "DATE IS #{@date}"
    @posts = BlogPost.published_in_month(@date).page(params[:page]).per(10)
    render :index
  end

所以打印出的日期是我看到的:

DATE IS 2013-12-01 00:00:00 +0100

但是在我的日志中,我看到错误月份的帖子,这是一个条目日志:

SELECT "blog_posts".* FROM "blog_posts" WHERE ("blog_posts"."published_date" BETWEEN '2013-11-30 23:00:00.000000' AND '2013-12-31 22:59:59.999999') LIMIT 10 OFFSET 0

当我的输入日期为2013-11-30时,此2013-12-01来自何处,如果我错误地将其缩小以产生不正确的查询,我该如何重写我的范围

2 个答案:

答案 0 :(得分:6)

这可能有所帮助:

scope :from_month, -> { where(created_at: DateTime.now.beginning_of_month..DateTime.now.end_of_month) }

答案 1 :(得分:3)

也许最好使用SQL方法来确定每条记录的月份:

scope :published_in_month, ->(date) { where("MONTH(created_at) = ?", date.month) }

Postgresql版本:

scope :published_in_month, ->(date) { where("DATE_PART('month', timestamp created_at) = ?", date.month) }

(未经测试)