Rails scope without raw sql

Hi, I’ve been stung when deploying a rails app to heroku, and I’m fairly
confident the problem is the difference between my local db sqlite3, and
the heroku standard free shared db which is postgres(i think).

I have a scope in my model that looks like this

scope :not_archived, :conditions => [‘application_state != “archived”’]

The idea is I want to get back all the records where the
application_sate value is not equal to the string “archived”.

This works fine locally, but in the Heroku logs it throws up the
following error :

ActionView::Template::Error (PG::Error: ERROR: column “archived” does
not exist
SELECT COUNT(*) FROM “coach_applications” WHERE
“coach_applications”.“user_id” = 10 AND (application_state !=
“archived”)):

It’s looking for a column archived, which is not what I want.

Essentially what I want is a proper Rails ORM style scope that returns
the rows in a db where the value of column is not equal to something,
instead of me having to resort to actual SQL comands in my scope.

Any suggestions would be very helpful!

I thought this would be easy to find, but the closest I can find is

which still seems pretty messy

Thanks

On Wed, Jul 25, 2012 at 3:32 PM, Michael B. [email protected]
wrote:

Hi, I’ve been stung when deploying a rails app to heroku, and I’m fairly
confident the problem is the difference between my local db sqlite3, and
the heroku standard free shared db which is postgres(i think).

Yes, it’s PG.

I have a scope in my model that looks like this

scope :not_archived, :conditions => [‘application_state != “archived”’]

This works fine locally, but in the Heroku logs it throws up the
following error :

ActionView::Template::Error (PG::Error: ERROR: column “archived” does
not exist
SELECT COUNT(*) FROM “coach_applications” WHERE
“coach_applications”.“user_id” = 10 AND (application_state !=
“archived”)):

It’s looking for a column archived, which is not what I want.

Notice the double quotes around the table name/column in the first
part? What happens if you change your scope to the form of
[ "application_state != ‘archived’ " ]
or
[ "application_state != ? ", “archived” ]

Untested, but PG is annoyingly (IMO) idiosyncratic at times.

HTH!

Hassan S. ------------------------ [email protected]

twitter: @hassan

Cheers for the help, yes, the single quotes does solve the problem.

Out of interest is there a better way of doing this, I’ve read in
numerous places that using raw SQL in rails apps is not a great idea as
it means rails cant change the SQL depending on the current database.

As no ActiveRecord method has been suggested for ‘not equals’ I’m
guessing there isn’t an easy one.

Do you consider using raw SQl like this bad practice? Or just avoid when
possible?

Cheers

On Jul 25, 2012, at 6:38 PM, Hassan S. wrote:

Untested, but PG is annoyingly (IMO) idiosyncratic at times.

There is absolutely nothing “idiosyncratic” about a string in double
quotes being treated as a column name–it is the SQL standard. If MySQL
does not do this, then (as usual when you find a difference between
MySQL and PostgreSQL), MySQL is non-compliant.


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