Relation count returns syntax error in Rails 4.1.X

Until Rails 4.0.4 everything was working fine until I upgraded to latest
Rails version. It seems to be a bug because from the error message looks
like rails is doing just a count(Bla bla )without using properly using a
select count(id) from (SELECT COUNT(orders_header.id,
orders_header.created_at) FROM `orders_header` WHERE (shop_id=99 and
customer_id=1 and hash_key like
'539de64e8793790430052bc861dd0ff521334e32')

Is there a workaround for this problem?

query= OrderHeader.select("orders_header.id,
orders_header.created_at").where("shop_id=#{shop_id} and
customer_id=#{customer_id} and hash_key like
'#{current_hash_key}'").order("id desc")
       if query.nil?
         return true # no duplicates found
       end
       if (query.count>0) # duplicates found
# I get the error righ here
       end
ERROR
SELECT COUNT(orders_header.id, orders_header.created_at) FROM
`orders_header` WHERE (shop_id=99 and customer_id=1 and hash_key like
'539de64e8793790430052bc861dd0ff521334e32')
Mysql2::Error: You have an error in your SQL syntax; check the manual
that corresponds to your MySQL server version for the right syntax to
use near ' orders_header.created_at) FROM `orders_header` WHERE
(shop_id=99 and customer_' at line 1: SELECT COUNT(orders_header.id,
orders_header.created_at) FROM `orders_header` WHERE (shop_id=99 and
customer_id=1 and hash_key like
'539de64e8793790430052bc861dd0ff521334e32')

Rails introduced a breaking change to select and count being used together in the same relation. Either remove your call to “select”, since it is unnecessary here, or call “count(:all)”.

More info here: https://github.com/rails/rails/issues/15138

Josh,

If I remove the call to "select" how to specify which columns to select?
PS: You don't want Rails to select all using wildcard * as it will
affect
performance.

Thanks
Rod

If you’re calling count, it doesn’t matter what select values you’ve passed, since you’re asking ActiveRecord to return an aggregate, not any column values.

I see that, but sometimes you want to reuse code in the same relation.
For instance if you do a query first using restricted columns and later
you need to do a count based on the result. Let's say in the first
relation with selected columns (col1, col2, etc.) you want to use to
fill an array. From what I understand it doesn't work if I try to obtain
a count from this relation. In fact, it doesn't make sense to do a
relation just to do a count.

In this scenario you would need two relations, one for the selected
columns and another only for count. I would prefer do it using raw SQL,
don't you agree?

Rod

josh.jordan@gmail.com wrote in post #1148444:

That was the point I was making in the issue I opened, yes.

I see that, but sometimes you want to reuse code in the same relation.
For instance if you do a query first using restricted columns and later
you need to do a count based on the result. Let's say in the first
relation with selected columns (col1, col2, etc.) you want to use to
fill an array. From what I understand it doesn't work if I try to obtain
a count from this relation. In fact, it doesn't make sense to do a
relation just to do a count.

In this scenario you would need two relations, one for the selected
columns and another only for count. I would prefer do it using raw SQL,
don't you agree?

Why not just do the count on the array? That would save running two
queries, one for the data and one for the count. Or am I missing
something?

Colin

Thanks, I am glad we are on the same page. Sorry, I did not see your
github post. I will check that right now.
Rod

By the way what would be more efficient, count(:all) or count(1)?
thanks
Rod