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模板创建新操作并共享其输出.

相关文章

validates:conclusion,:presence=>true,:inclusion=>{...
一、redis集群搭建redis3.0以前,提供了Sentinel工具来监控各...
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣...
上一篇博文 ruby传参之引用类型 里边定义了一个方法名 mo...
一编程与编程语言 什么是编程语言? 能够被计算机所识别的表...
Ruby类和对象Ruby是一种完美的面向对象编程语言。面向对象编...