Rails模型方法返回错误值

时间:2018-07-19 02:27:40

标签: ruby-on-rails activerecord ruby-on-rails-5 rails-activerecord

在Rails控制台中,我试图在模型中调用一个方法,该方法返回用户订单数量的总和。

方法是:

def self.user_total(current_user)
  quantity = UserOrder.select("sum(quantity)").where(user_id: current_user)
  quantity
end

如果我在Rails控制台中运行Order.user_total(1),它将返回: #<ActiveRecord::Relation [#<UserOrder id: nil>]>

但是,生成的SQL是正确的:

SELECT  sum(quantity) FROM "user_orders" 
WHERE "user_orders"."user_id" = $1 LIMIT $2 
[["user_id", 1], ["LIMIT", 11]]

如果我在dbconsole中运行SQL,它将返回正确的总和:

SELECT  sum(quantity) FROM user_orders 
WHERE user_orders.user_id = 1;

=> 115

如果我删除where约束,它也会返回#<ActiveRecord::Relation [#<UserOrder id: nil>]>

在rails控制台中,如果我只是生成简单的SQL查询以查找所有数量,它将返回

irb(main):005:0> UserOrder.select("quantity")
  UserOrder Load (0.4ms)  SELECT  "user_orders"."quantity" FROM "user_orders" LIMIT $1  [["LIMIT", 11]]
=> #<ActiveRecord::Relation [
#<UserOrder id: nil, quantity: 1>
, #<UserOrder id: nil, quantity: 1>
, #<UserOrder id: nil, quantity: 1>
, #<UserOrder id: nil, quantity: 1>
, #<UserOrder id: nil, quantity: 1>
, #<UserOrder id: nil, quantity: 8>
, #<UserOrder id: nil, quantity: 102>
]>

所以我可以看到UserOrder id: nil的来源,但是同时为什么它会返回那个“列”(因为缺少更好的词),而不是返回其中的数量或总和其他例子?

1 个答案:

答案 0 :(得分:3)

有一种查询总和的方法:

UserOrder.where(user_id: current_user).sum(:quantity)

作为样式要点,我想说在模型层中命名自变量current_user是没有意义的,因为它不关心被查询的用户是“当前”用户登录用户或其他用户。