ruby-on-rails – ActiveRecord sum和pluck方法返回奇怪的值

前端之家收集整理的这篇文章主要介绍了ruby-on-rails – ActiveRecord sum和pluck方法返回奇怪的值前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有订单模型和Order.all返回下面.
[
[0] #<Order:0x007f9d9e236de0> {
              :id => 15,:user_id => 2,:artist_id => nil,:address_id => 18,:paid_at => nil,:payment_type => "bank",:guid => "c8e22764774adc6825348b8874b581e8",:created_at => Mon,24 Aug 2015 19:42:09 JST +09:00,:updated_at => Mon,24 Aug 2015 19:45:38 JST +09:00,:ordered_at => Mon,24 Aug 2015 19:45:37 JST +09:00,:total => 43890
},[1] #<Order:0x007f9d9e2367a0> {
              :id => 12,:guid => "274b4a8653395023125a4724139efc09",24 Aug 2015 19:10:38 JST +09:00,24 Aug 2015 19:41:25 JST +09:00,24 Aug 2015 19:41:22 JST +09:00,:total => 48689
},[2] #<Order:0x007f9d9e236318> {
              :id => 11,:address_id => 14,:paid_at => Mon,:payment_type => "credit_card",:guid => "b075f4a6f31c32942152f7d50d2bd098",24 Aug 2015 19:03:39 JST +09:00,:total => 5010
},[3] #<Order:0x007f9d9e235e40> {
              :id => 10,:user_id => nil,:address_id => nil,:payment_type => nil,:guid => "916ff17977cb176c5e5740faab92a08c",:created_at => Sat,22 Aug 2015 19:30:38 JST +09:00,:updated_at => Sat,:ordered_at => nil,:total => 0
},[4] #<Order:0x007f9d9e2356c0> {
              :id => 9,:user_id => 1,:address_id => 9,:guid => "a4f1dd11ad035d1747a37776b062021f",22 Aug 2015 19:30:04 JST +09:00,:updated_at => Tue,01 Sep 2015 00:00:09 JST +09:00,:ordered_at => Sat,22 Aug 2015 00:00:00 JST +09:00,[5] #<Order:0x007f9d9e2342c0> {
              :id => 8,:paid_at => Thu,20 Aug 2015 19:30:04 JST +09:00,:guid => "b816503b6b95d35455262cd4d8b9e822",:ordered_at => Wed,19 Aug 2015 19:30:04 JST +09:00,:total => 0
}

]

但是,Order.sum(:total)返回

Order.sum(:total)
(0.4ms)  SELECT SUM("orders"."total") FROM "orders"
12000

和Order.pluck(:total)返回

Order.pluck(:total)
CACHE (0.0ms)  SELECT "orders"."total" FROM "orders"  ORDER BY   "orders"."created_at" DESC
[
    [0] nil,[1] nil,[2] nil,[3] nil,[4] 2000,[5] 10000
]

所以发生了什么事?
我怎样才能获得正确的价值?

非常感谢.

我有默认范围,但只有订单,

default_scope { order(created_at: :desc) }

.这会影响这个问题吗?

这是’Order.all’查询.

Order Load (1.0ms) SELECT "orders".* FROM "orders" ORDER BY "orders"."created_at" DESC 
Item Load (0.4ms) SELECT "items".* FROM "items" WHERE "items"."order_id" = $1 [["order_id",20]] 
Flower Load (0.7ms) SELECT "flowers".* FROM "flowers" WHERE "flowers"."type" IS NULL AND "flowers"."item_id" = $1 ORDER BY "flowers"."created_at" ASC LIMIT 1 [["item_id",8]]

Order.all.map(&:total)返回

[ [ 0] 43890,[ 1] 48689,[ 2] 5010,[ 3] 0,[ 4] 5010,[ 5] 0 ]

抱歉延迟回复……

这是我对orders.html.erb的结果,
我只使用myapp_development和myapp_test数据库.

Order.count 6
Order.sum(:total)   12,000
Order.pluck(:total) [nil,nil,2000,10000,nil]
Order.all.map(&:total)  [0,5010,16110,0]
#<Order id: 6,user_id: 1,artist_id: nil,address_id: nil,paid_at: nil,payment_type: nil,guid: "a6471c15680a0fbcd3f515a1bdf83566",created_at: "2015-09-02 07:24:37",updated_at: "2015-09-02 07:24:37",ordered_at: nil,total: nil,conveni_name: nil,conveni_code: nil,invoice_id: nil>

#<Order id: 5,address_id: 14,paid_at: "2015-09-02 07:24:36",payment_type: 0,guid: "b68989c73bc0af34e3eef56abbcb306c",created_at: "2015-09-01 08:58:07",updated_at: "2015-09-02 07:24:36",ordered_at: "2015-09-02 07:24:36",invoice_id: nil>

#<Order id: 4,address_id: 1,payment_type: 2,guid: "1863cc6f2884b88598c4524d564b8a4a",created_at: "2015-09-01 06:07:52",updated_at: "2015-09-01 06:07:52",ordered_at: "2015-08-31 15:00:00",total: 2000,invoice_id: nil>

#<Order id: 3,paid_at: "2015-08-30 06:07:52",guid: "a6f7e22fc9ea8bdccdbdcbb00d9ea250",ordered_at: "2015-08-29 06:07:52",total: 10000,invoice_id: nil>

#<Order id: 2,address_id: 11,paid_at: "2015-09-01 08:58:06",guid: "f29dd23315078fce2e5b38e16d027c45",created_at: "2015-09-01 06:06:33",updated_at: "2015-09-01 08:58:06",ordered_at: "2015-09-01 08:58:06",invoice_id: nil>

#<Order id: 1,user_id: nil,guid: "6f2ffd0e8ba491fba10d69b73e717384",created_at: "2015-09-01 03:08:44",updated_at: "2015-09-01 03:08:44",invoice_id: nil>

解决方法

您提供的信息是矛盾的.

我想你看看不同的数据库.

让我解释为什么我这么认为.

事实#1基于Order.all输出,我们有:

#<Order id: 15,total: 43890.0>
#<Order id: 12,total: 48689.0>
#<Order id: 11,total: 5010.0>
#<Order id: 10,total: 0.0>
#<Order id: 9,total: 5010.0>
#<Order id: 8,total: 0.0>

这里的总属性数据库中的内容相同.即使您在Order模型中定义了具有相同名称方法,该属性也不应受其影响.

事实#2基于Order.pluck(:total)输出,total: nil> #<Order id: 12,total: nil> #<Order id: 11,total: nil> #<Order id: 10,total: nil> #<Order id: 9,total: 2000> #<Order id: 8,total: 10000>

同样,这里的总属性数据库中的内容相同.同样,它不受模型中定义的方法的影响.

现在我们看到事实1与事实2相矛盾.我几乎可以肯定你在这里看不同的数据库.

确保您不会产生矛盾结果的最佳方法是创建一个包含此内容的新页面

<!-- orders.html.erb -->

<table>
  <tr>
    <td>Order.count</td>
    <td><%= Order.count %></td>
  </tr>
  <tr>
    <td>Order.sum(:total)</td>
    <td><%= number_with_delimiter Order.sum(:total) %></td>
  </tr>
  <tr>
    <td>Order.pluck(:total)</td>
    <td><%= Order.pluck(:total) %></td>
  </tr>
  <tr>
    <td>Order.all.map(&amp;:total)</td>
    <td><%= Order.all.map(&:total) %></td>
  </tr>
</table>

<% Order.all.each do |o| %>
  <p>
    <code><%= o.inspect %></code>
  </p>
<% end %>

并提供此页面输出以供进一步探索.

基本上我要求的是:

>检查您是否使用两个不同的数据库>如果#1无用,请使用给定的ERB模板创建新操作并共享其输出.

猜你在找的Ruby相关文章