我是Ruby初学者。我正在尝试编写一个函数(在Rails应用程序中),可能允许或不允许用户发送消息,具体取决于他们当前的每日配额。我在消息控制器中调用此函数,而它在消息模型中定义。
功能定义:
def limit_has_been_reached(user)
limit = 50
messages = user.messages.find(:all, :conditions => ["created_at between ? and ?",
Date.today - 1.day, Date.today])
if messages.length < limit
return false
else
return true
end
end
功能调用:
def create
...
if !@message.limit_has_been_reached(current_user)
send
else
reject
这就是我到目前为止所拥有的。我的问题是,该函数始终返回false
。检查后,我注意到查询总是返回一个空数组。以下是在rails控制台中运行时的功能:
Message Load (0.4ms) SELECT `messages`.* FROM `messages` WHERE `messages`.`user_id` = ? AND (created_at between '2014-01-30' and '2014-01-31') [["user_id", 1]]
此时,示例中的用户(id = 1)在该时间范围内发送了许多消息。任何人都可以详细说明为什么会发生这种情况?谢谢
修改
将函数定义中的第4行更改为Date.today - 1.day, DateTime.now
。
答案 0 :(得分:2)
我建议你创建一个范围:
class User < ActiveRecord::Base
scope :reached_limit, -> (self, limit) {
self.messages.where(created_at: Date.beginning_of_day..Date.end_of_day).count >= limit
}
end
然后以这种方式使用它。
def create
if current_user.limit_has_been_reached?(limit)
# ...
end
您可能希望将limit
存储在此User类的costant或属性中。
答案 1 :(得分:1)
你必须在方法
的末尾定义你有回报的变量或数据def limit_has_been_reached(user)
limit = 50
messages = user.messages.find(:all, :conditions => ["created_at between ? and ?",
Date.today - 1.day, Date.today])
if messages.length < limit
result = false
else
result = true
end
result
end
如果您在模型中定义方法,则使用def self.limit_has_been_reached(user)