为什么错误仅在通过 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