Why does Rails convert scopes to downcase

I found a strange behavior in Rails 4 with scopes when I use postgres.

I have a Object with saleStartDate and saleEndDate attributes.

scope :active, -> { where(isActivate: true) }

scope :activeDate, -> { active.where("? BETWEEN saleStartDate AND saleEndDate", Date.today)}

When I use sqlite, all works when I want to get the object with the activeDate scope.

When I use postgres, I get an error “pg:error salestartdate column not found”!

Postgres is case sensitive! So why does Rails convert saleStartDate to salestartdate in a scope?

I changed saleStartDate to sale_start_date. Now it works.

Is it best practice to use _ and not CamelCase in scopes?

Postgres is case sensitive! So why does Rails convert saleStartDate to salestartdate in a scope?

You misunderstand postgres. It implements the case insensitivity required by SQL standards via a bit of a kludge--downcasing all identifiers that are not quoted.

I'd bet this would have worked:

scope :activeDate, -> { active.where('? BETWEEN "saleStartDate" AND "saleEndDate"', Date.today)}

Is it best practice to use _ and not CamelCase in scopes?

Well, I don't know that I want to say "best practice" because I *like* using mixed case in my schemas, and I have a lot of legacy tables that way, but with postgres in particular is sure as heck would be *easier* to use all lower case :wink: