(0.2ms) SELECT COUNT() FROM “tests” WHERE (is_billed = ‘false’)
vice
(0.2ms) SELECT COUNT() FROM “tests” WHERE (is_billed = ‘f’)
The second form is generated from the ( :is_billed => false ) construction. If I cut and paste “is_billed = ‘f’” into the where clause then it works. I presume this is some sort of implementation issue with sqlite3.
By using :is_billed => false you are telling rails that you want the
value to be whatever rails uses as the logical value false (which
appears to be "f"). By specifying yourself that the contents of the
column must be the string "false" it does not find the records.
I am a bit surprised that the sqlite example you gave works. Are you
sure you entered the query exactly as you showed? I am not that
familiar with sqlite however.
It appears that sqlite3 does not have a concept of a boolean type. I find that you can put literally any string into a boolean column in an sqlite3 database. As I was testing in sqlite with data rows I had inserted having is_billed values ( ‘false’ ) selecting where ( “is_billed” = ‘false’ ) naturally worked. Ah well, live and learn.