Question

Today i want change my Postgres enum to Rails 4.1 enum. I make some steps.

migrations:

 create_table :users do |t|
   # other column here
   t.column :status, :integer
 end

in model:

class User < ActiveRecord::Base
  enum status: [ :local, :tourist ]
end

now create user:

  => User.create(email: 'ffoo@mai.com', password: '12345678', status: 'local')
  => #<User id: "53621ec84d6163124", email: "ffoo@mai.com", status: 0, ......>
  => u = User.last
  => User Load (0.9ms)  SELECT  "users".* FROM "users" ........
  => #<User id: "53621ec84d6163124", email: "ffoo@mai.com", status: 0, ......>
  => u.local?
  => true

Try find local users(and now i have strange behavior of my enum):

  => User.where("status <> ?", User.statuses[:local])
  => User Load (0.9ms)  SELECT "users".* FROM "users"  WHERE (status <> 0)
  => []

WTF?

  => User.where("status <> ?", User.statuses[:tourist])
  => User Load (0.9ms)  SELECT "users".* FROM "users"  WHERE (status <> 1)
  => #<User id: "53621ec84d6163124", email: "ffoo@mai.com", status: 0, ......>

So problem, this query User.where("status <> ?", User.statuses[:local]) should return my local user. Or i doing something wrong?

Était-ce utile?

La solution

You are using a wrong operator here.

"status <> ?" equals  "status != ?"

Instead you want to use

"status = ?"

Postgres comparison operators

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top