ActiveRecord sum and drop method returns strange value

I have an order model, and Order.all returned 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 the correct value?

Thanks a lot of comments.

I have a default scope, but only order,

  default_scope { order(created_at: :desc) } 

. Does this affect this issue?

This is the query "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) 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 only use the 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> 
+6
source share
2 answers

The information you provide is contradictory.

I think you are looking at different databases.

Let me explain why I think so.

Fact # 1 Based on the output of Order.all 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> 
Attribute

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

Fact # 2 Based on the output of Order.pluck(:total) 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, the total attribute here is identical to what is written in the database. Again, this does not affect the methods defined in your model.

Now we see that Fact 1 contradicts Factor 2 . I am pretty sure that you are looking at different databases here.

The best way to make sure you don't get conflicting 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 a way out of this page for further study.

I basically ask:

  • Make sure you are not working with two different databases.
  • If # 1 is useless, create a new action with the given ERB template and publish it.
+6
source

If Order.pluck(:total) returns something other than Order.all.map(&:total) , then the "total" method can be defined somewhere and thus overrides the column attribute method. You can check the original file name and line of this method with:

 Order.new.method(:total).source_location 

It should reference activerecord-4.2.4/lib/active_record/attribute_methods.rb . If this is not the case, then you accidentally overwrite the ActiveRecord method.

+4
source

All Articles