【问题标题】:Basic Rails - ActiveRecord scope not working基本 Rails - ActiveRecord 范围不起作用
【发布时间】:2015-03-10 12:05:03
【问题描述】:

我正在尝试从控制器调用 ActiveRecord 模型范围。但是当我这样做时,即使查询工作正常,它也只会返回 nil。

这是模型:

class Stats < ActiveRecord::Base
    scope :by_latest_date, ->{select("date, sum(users) AS users, 
                                     sum(clicks) AS clicks").group("date").limit(1)}
end

Scope :by_latest_date 应该返回最近记录日期的用户和点击的总和。但是当我从控制器调用它时:

class ChartsController < ApplicationController
    def user_stats
        @stats = Stats.by_latest_date
    end
end

当数据库中有记录时,@stats 被简单地设置为 nil。当数据库中没有记录时,设置为空数组。

我不明白为什么。当我将范围查询复制/粘贴到控制器中时,该代码有效,当我将 Stats.by_latest_date 直接放入我的 RSPEC 测试时也有效。也许控制器和作用域块有什么特别之处?但如果有,我找不到。

【问题讨论】:

  • 你不是在细箭头之前错过了, 吗?不过它应该会破坏测试...
  • 是的,它在我的程序中,所以我将它添加到问题中。这里的代码解释而不是完全复制我的代码。
  • 你有没有试过用 lambda 代替细箭头,甚至把它放到类方法中?
  • 我们只需要一个块,因为它不带参数。
  • 你使用的是哪个数据库?

标签: ruby-on-rails-3 postgresql activerecord


【解决方案1】:

我认为您正在尝试获得一个范围来做一些它不打算做的事情,它是为了在基本模型而不是聚合上确定范围。仅仅创建一个方法可能更容易。像你一样先让它在控制台中工作,然后把它放到类中。

顺便说一句 - 日期是日期(因为没有时间组件) - 如果它是时间戳,那么分组将不是按实际日期而是按时间戳,所以无论如何你可能只会得到最后一个。

无论如何,分组都会对数据进行排序,因为它必须将数据收集在一起 - 但可能不是按照正确的顺序,你确定你得到了你想要的吗?

【讨论】:

    猜你喜欢
    • 2013-04-16
    • 2013-08-30
    • 1970-01-01
    • 1970-01-01
    • 2017-01-31
    • 1970-01-01
    • 1970-01-01
    • 2011-12-17
    • 2011-08-19
    相关资源
    最近更新 更多