Ramses
Ramses

Reputation: 996

What is the "Rails Way" of doing a query with an OR clause using ActiveRecord?

I'm using Rails 3 with a MySQL database, and I need to programmatically create a query like this:

select * from table where category_name like '%category_name_1%' 
OR category_name like '%category_name_2%'
(...snip...)
OR category_name like '%category_name_n%'

Given the table size and the project scope (500 rows at most, I think), I feel that using something like thinking sphinx would be overkill. I know I could simply do this by writing the query string directly, but wanted to know if there's an ActiveRecord way to do this. There's no mention of this on the official guide, and I've been googling for a long while now, just to end empty-handed :(

Also, is there a reason (maybe a Rails reason?) to not to include the OR clause?

Thanks!

Upvotes: 1

Views: 519

Answers (4)

pguardiario
pguardiario

Reputation: 54984

Mysql has a regexp function now that can clean things up a bit, assuming there's no regex metachars in your category names:

Table.where "category_name regexp '#{names.join('|')}'"

Upvotes: 1

Harish Shetty
Harish Shetty

Reputation: 64363

Assuming you have an array names with category names:

Model.where( names.map{"category_name LIKE ?"}.join(" OR "),
  *names.map{|n| "%#{n}%" } )

Upvotes: 7

Pavel S
Pavel S

Reputation: 1543

you should google first, there is already an answer. Look here and then here and you'll get something like this:

accounts = Account.arel_table
Account.where(accounts[:name].matches("%#{user_name}%").or(accounts[:name].matches("%#{user_name2}%")))

Upvotes: 4

Waynn Lue
Waynn Lue

Reputation: 11375

If you look at the guide, they have examples that can easily be modified to this:

Client.where("orders_count = ? OR locked = ?", params[:orders], false)

Upvotes: 1

Related Questions