我有一位候选人,其票数很高。
我想获得当月创建的候选人的投票?
@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"
答案 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