Rails 3: scope is not true
How do I convert the following into something that works on sqlite and mysql? Note, internal
is nullable.
scope :external, where("internal is not true")
(In Rails开发者_运维问答 4, one can simply use:)
scope :external, where.not(internal: true)
ActiveRecord is smart enough for doing this, just do:
scope :external, where(internal: [false, nil])
That would be transformed in similar SQL (with table name and quetes probably):
- for PostgreSQL and SQLite
internal IN ('f') OR internal IS NULL
- for MySQL
internal IN (0) OR internal IS NULL
If need more control you can use Arel:
scope :external,
where(arel_table[:internal].eq(false).or(arel_table[:internal].eq(nil)))
Which would be:
- for PostgreSQL and SQLite
internal = 'f' OR internal IS NULL
- for MySQL
internal = 0 OR internal IS NULL
Remember, if you need to check NULL values in SQL always use IS NULL
or IS NOT NULL
expressions.
Expresions ... <> NULL
, ... = NULL
, ... IN (NULL)
are evaluated as false for everything.
So, NULL <> NULL
is false and NUL = NULL
is false.
Try scope :external, where('internal IN (?)', [false,nil])
Try scope :external, where(:internal => !true)
精彩评论