0

为什么错误仅在通过 Resque 调度程序执行时发生?

我不知道为什么在通过 resque-scheduler 调用时只选择用户名。我希望选择 users 表的所有列。

resque-scheduler 调用的作业是这样的:

class UserLicenseJob
  @queue = :some_queue

  def self.perform(*args)
    users = User.license_count_exceeded
    # Do something to the 'users'
  end
end

错误日志如下所示:

failed: #<ActiveRecord::StatementInvalid: Mysql2::Error: Unknown column 'users.license_count' in 'having clause': SELECT `users`.`username` FROM `users` LEFT OUTER JOIN devices ON devices.user_id = users.id GROUP BY users.id HAVING users.license_count != 0 AND users.license_count > COUNT(devices.id)>

用户和设备模型之间的关系如下图所示:

class User < ActiveRecord::Base

  has_many :devices

  scope :license_count_exceeded, -> {
    select("users.*, COUNT(devices.id) AS devices_count")
      .joins("LEFT OUTER JOIN devices ON devices.user_id = users.id")
      .group("users.id")
      .having("users.license_count != 0 AND users.license_count > COUNT(devices.id)")
  }

end

class Device < ActiveRecord::Base

  belongs_to :user

end

通过 Rails 控制台调用成功完成。

irb(main):014:0> User.select("users.*, COUNT(devices.id) AS devices_count").joins("LEFT OUTER JOIN devices ON devices.user_id = users.id").group("users.id").having("license_count != 0 AND license_count > COUNT(devices.id)")
  User Load (0.5ms)  SELECT users.*, COUNT(devices.id) AS devices_count FROM `users` LEFT OUTER JOIN devices ON devices.user_id = users.id GROUP BY users.id HAVING license_count != 0 AND license_count > COUNT(devices.id)
=> #<ActiveRecord::Relation []>

通过 MySQL 控制台调用成功完成。

mysql> SELECT users.*, COUNT(devices.id) AS devices_count FROM `users` LEFT OUTER JOIN devices ON devices.user_id = users.id GROUP BY users.id HAVING users.license_count != 0 AND users.license_count > COUNT(devices.id);
Empty set (0.00 sec)

取决于版本;

  • 红宝石:2.1.2p95
  • MySQL:5.6.20
  • Ruby on Rails:4.1.4
  • mysql2:0.3.17
4

1 回答 1

0

解决。这只是一个无效的 SQL 语句。

scope :license_count_exceeded, -> {
  select("users.license_count AS license_count, COUNT(devices.id) AS devices_count")
    .joins("LEFT OUTER JOIN devices ON devices.user_id = users.id")
    .where("users.license_count != 0")
    .group("users.license_count")
    .having("users.license_count > COUNT(devices.id)")
}
于 2014-12-22T03:13:28.590 回答