如何获取当月创建的记录?

时间:2014-03-15 11:18:26

标签: ruby-on-rails ruby postgresql

我有一位候选人,其票数很高。

我想获得当月创建的候选人的投票?

@candidate.votes.from_this_month

scope :from_this_month, where("created_at > ? AND created_at < ?", Time.now.beginning_of_month, Time.now.end_of_month)

这给了我一个PG错误: PG ::错误:错误:列引用\&#34; created_at \&#34;含糊不清

如果我尝试

scope :from_this_month, where("vote.created_at > ? AND vote.created_at < ?", Time.now.beginning_of_month, Time.now.end_of_month)

我收到以下错误

PG::Error: ERROR:  missing FROM-clause entry for table "vote"

5 个答案:

答案 0 :(得分:10)

更正范围

scope :from_this_month, lambda {where("votes.created_at > ? AND votes.created_at < ?", Time.now.beginning_of_month, Time.now.end_of_month)}

这是因为在轨道中,模型名称是单数的(即Vote),并且通过对流创建的表格是pural(例如votes

修改

这可以用lambda {where(created_at: Time.now.beginning_of_month..(Time.now.end_of_month))}更简单地编写,由于以下注释中给出的原因,我们需要使用lambda。

Thanx BroiSatse 提醒:D

答案 1 :(得分:7)

您还需要将其放在lamda中。

scope :from_this_month, lambda { where("votes.created_at > ? AND votes.created_at < ?", Time.now.beginning_of_month, Time.now.end_of_month) }

否则它似乎可以工作,你的测试都会通过,但如果你的应用程序运行超过一个月,你将开始得到不正确的结果,因为在类加载时评估Time.now,而不是在调用方法时

答案 2 :(得分:1)

您可以使用ActiveRecord Association Extension

#app/models/Candidate.rb
Class Candidate < ActiveRecord::Base
   has_many :votes do
       def from_this_month
           where("created_at > ? AND created_at < ?", Time.now.beginning_of_month, Time.now.end_of_month)
       end
   end
end

这应该允许您调用@candidate.votes.from_this_month来返回所需的条件数据

答案 3 :(得分:0)

  scope :this_month, -> { where(created_at: Time.now.beginning_of_month..Time.now.end_of_month) }

您可以调用范围:

Model.this_month

答案 4 :(得分:0)

从 Rails 5 开始,您的语法更加简洁。在您的投票模型中添加范围 this_month

 scope :this_month, -> { where(created_at: Date.today.all_month) }

您现在可以查询@candidates.votes.this_month