Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

ActiveRecord sum and pluck method return strange value

I have Order model and Order.all returns below.

[
[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,
         :user_id => 2,
       :artist_id => nil,
      :address_id => 18,
         :paid_at => nil,
    :payment_type => "bank",
            :guid => "274b4a8653395023125a4724139efc09",
      :created_at => Mon, 24 Aug 2015 19:10:38 JST +09:00,
      :updated_at => Mon, 24 Aug 2015 19:41:25 JST +09:00,
      :ordered_at => Mon, 24 Aug 2015 19:41:22 JST +09:00,
           :total => 48689
},
[2] #<Order:0x007f9d9e236318> {
              :id => 11,
         :user_id => 2,
       :artist_id => nil,
      :address_id => 14,
         :paid_at => Mon, 24 Aug 2015 19:10:38 JST +09:00,
    :payment_type => "credit_card",
            :guid => "b075f4a6f31c32942152f7d50d2bd098",
      :created_at => Mon, 24 Aug 2015 19:03:39 JST +09:00,
      :updated_at => Mon, 24 Aug 2015 19:10:38 JST +09:00,
      :ordered_at => Mon, 24 Aug 2015 19:10:38 JST +09:00,
           :total => 5010
},
[3] #<Order:0x007f9d9e235e40> {
              :id => 10,
         :user_id => nil,
       :artist_id => nil,
      :address_id => nil,
         :paid_at => nil,
    :payment_type => nil,
            :guid => "916ff17977cb176c5e5740faab92a08c",
      :created_at => Sat, 22 Aug 2015 19:30:38 JST +09:00,
      :updated_at => Sat, 22 Aug 2015 19:30:38 JST +09:00,
      :ordered_at => nil,
           :total => 0
},
[4] #<Order:0x007f9d9e2356c0> {
              :id => 9,
         :user_id => 1,
       :artist_id => nil,
      :address_id => 9,
         :paid_at => nil,
    :payment_type => "bank",
            :guid => "a4f1dd11ad035d1747a37776b062021f",
      :created_at => Sat, 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,
           :total => 5010
},
[5] #<Order:0x007f9d9e2342c0> {
              :id => 8,
         :user_id => 1,
       :artist_id => nil,
      :address_id => 9,
         :paid_at => Thu, 20 Aug 2015 19:30:04 JST +09:00,
    :payment_type => "credit_card",
            :guid => "b816503b6b95d35455262cd4d8b9e822",
      :created_at => Sat, 22 Aug 2015 19:30:04 JST +09:00,
      :updated_at => Sat, 22 Aug 2015 19:30:04 JST +09:00,
      :ordered_at => Wed, 19 Aug 2015 19:30:04 JST +09:00,
           :total => 0
}

]

However, Order.sum(:total) returns

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

and Order.pluck(:total) returns

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
]

So, what happened? How can I get correct value?

Thanks many comments.

I have default scope, but only order,

   default_scope { order(created_at: :desc) }

. Is this affect this probrem??

This is 'Order.all' query.

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) returns

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

sorry for the delay in reply...

This is my result for orders.html.erb, and I use only myapp_development and myapp_test databases.

Order.count 6
Order.sum(:total)   12,000
Order.pluck(:total) [nil, nil, 2000, 10000, nil, nil]
Order.all.map(&:total)  [0, 5010, 0, 0, 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, user_id: 1, artist_id: nil, 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", total: nil, conveni_name: nil, conveni_code: nil, invoice_id: nil>

#<Order id: 4, user_id: 1, artist_id: nil, address_id: 1, paid_at: nil, 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, conveni_name: nil, conveni_code: nil, invoice_id: nil>

#<Order id: 3, user_id: 1, artist_id: nil, address_id: 1, paid_at: "2015-08-30 06:07:52", payment_type: 0, guid: "a6f7e22fc9ea8bdccdbdcbb00d9ea250", created_at: "2015-09-01 06:07:52", updated_at: "2015-09-01 06:07:52", ordered_at: "2015-08-29 06:07:52", total: 10000, conveni_name: nil, conveni_code: nil, invoice_id: nil>

#<Order id: 2, user_id: 1, artist_id: nil, address_id: 11, paid_at: "2015-09-01 08:58:06", payment_type: 0, 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", total: nil, conveni_name: nil, conveni_code: nil, invoice_id: nil>

#<Order id: 1, user_id: nil, artist_id: nil, address_id: nil, paid_at: nil, payment_type: nil, guid: "6f2ffd0e8ba491fba10d69b73e717384", created_at: "2015-09-01 03:08:44", updated_at: "2015-09-01 03:08:44", ordered_at: nil, total: nil, conveni_name: nil, conveni_code: nil, invoice_id: nil>
like image 788
myoo Avatar asked Aug 24 '15 11:08

myoo


1 Answers

Information you provide is contradictory.

I think you look at different databases.

Let me explain why I think so.

Fact #1 Based on Order.all output we have:

#<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>

total attribute here is identical to what is written in database. Even if you have method with the same name defined in Order model, this attribute should not be affected by it.

Fact #2 Based on Order.pluck(:total) output we have:

#<Order id: 15, 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>

Again, total attribute here is identical to what is written in database. And again it's not affected by methods defined in your model.

Now we see Fact 1 contradicts Fact 2. I'm almost sure you are looking at different databases here.

The best way to be sure that you don't get contradictory results is to create a new page with this content inside:

<!-- 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 %>

and give us output from this page for further exploration.

Basically what I ask for:

  1. Check you are not working with two different databases
  2. If #1 was useless, create a new action with given ERB template and share it's output.
like image 77
dimakura Avatar answered Oct 12 '22 23:10

dimakura