Forum: Ruby on Rails rails scope without raw sql

1d6026ff934f8f43cdab2f9e286ec918?d=identicon&s=25 Michael Baldock (embaldo)
on 2012-07-26 00:32
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

http://stackoverflow.com/questions/5426421/rails-m...

which still seems pretty messy

Thanks
Bee69cfed999cd13e3bff73d472a39ee?d=identicon&s=25 Hassan Schroeder (Guest)
on 2012-07-26 02:40
(Received via mailing list)
On Wed, Jul 25, 2012 at 3:32 PM, Michael Baldock <lists@ruby-forum.com>
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 Schroeder ------------------------ hassan.schroeder@gmail.com
http://about.me/hassanschroeder
twitter: @hassan
15eb13d662803f57bc4aea59704988b4?d=identicon&s=25 Scott Ribe (Guest)
on 2012-07-26 05:45
(Received via mailing list)
On Jul 25, 2012, at 6:38 PM, Hassan Schroeder 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 Ribe
scott_ribe@elevated-dev.com
http://www.elevated-dev.com/
(303) 722-0567 voice
1d6026ff934f8f43cdab2f9e286ec918?d=identicon&s=25 Michael Baldock (embaldo)
on 2012-07-26 11:11
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
Please log in before posting. Registration is free and takes only a minute.
Existing account

NEW: Do you have a Google/GoogleMail, Yahoo or Facebook account? No registration required!
Log in with Google account | Log in with Yahoo account | Log in with Facebook account
No account? Register here.