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