Why does Rails convert scopes to downcase

32 views
Skip to first unread message

Nicolas Mauchle

unread,
Sep 15, 2013, 7:48:46 AM9/15/13
to rubyonra...@googlegroups.com
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?



Scott Ribe

unread,
Sep 15, 2013, 5:13:33 PM9/15/13
to rubyonra...@googlegroups.com
On Sep 15, 2013, at 5:48 AM, Nicolas Mauchle <nmau...@gmail.com> 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 ;-)

--
Scott Ribe
scott...@elevated-dev.com
http://www.elevated-dev.com/
(303) 722-0567 voice




Reply all
Reply to author
Forward
0 new messages