如何正确查询当前用户在RoR中指定时间范围内发送的所有消息?

时间:2014-01-31 13:26:23

标签: ruby-on-rails database

我是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

2 个答案:

答案 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)