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?

On Sep 15, 2013, at 5:48 AM, Nicolas M. [email protected] wrote:

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:


Scott R.
[email protected]
http://www.elevated-dev.com/
(303) 722-0567 voice