0
votes

Hash way works just fine:

drummers = Drummer.where(:gender => true)

=> [#<Drummer id: 1, first_name: "Bernard", middle_name: nil, second_name: "Purdie", nick_name: "Pretty Purdie", gender: true, created_at: "2010-12-05 02:47:56", updated_at: "2010-12-05 02:50:42">]

But the same thing in String way:

drummers = Drummer.where("gender = true")

I got below error: ActiveRecord::StatementInvalid: SQLite3::SQLException: no such column: TRUE: SELECT "drummers".* FROM "drummers" WHERE (gender = TRUE)

anybody could tell mewhy?

2

2 Answers

0
votes

This is a sqlite error, not rails. When you say gender = true, it's looking for a column that is named true. Sqlite does not have booleans, so the correct way to do this is Drummer.where("gender = 1").

0
votes

You should avoid using strings where possible in your Arel queries.

If you're joining a table that also contains a field named 'gender' then this will break, because it's ambiguous. Using where(:gender => true) will automatically be namespaced for you, so that won't happen.

As your example shows, using strings also can create portability problems, if you're using a feature that your backend doesn't support.

I've been using a plugin called MetaWhere to augment ARel's syntax, making strings less necessary.