Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

ActiveRecord OR query Hash notation

I know there are 3 main notations for supplying arguments to the where ActiveRecord method:

  1. Pure String
  2. Array
  3. Hash

Specifying and for the where method is straight forward:

# Pure String notation Person.where("name = 'Neil' AND age = 27")  # Array notation Person.where(["name = ? AND age = ?", 'Neil', 27])  # Hash notation Person.where({name: "Neil", age: 27}) 

Specifying or for this same where method is stumping me for the hash syntax. Is it possible?

# Pure String notation Person.where("name = 'Neil' OR age = 27")  # Array notation Person.where(["name = ? OR age = ?", 'Neil', 27])  # Hash notation DOESN'T WORK Person.where({name: "Neil" OR age: 27}) 
like image 430
Neil Avatar asked Jun 28 '15 03:06

Neil


People also ask

What is ActiveRecord in Ruby on Rails?

Active Record is the M in MVC - the model - which is the layer of the system responsible for representing business data and logic. Active Record facilitates the creation and use of business objects whose data requires persistent storage to a database.

What is Activemodel?

Active Model is a library containing various modules used in developing classes that need some features present on Active Record.

What is ActiveRecord relation?

The Relation Class. Having queries return an ActiveRecord::Relation object allows us to chain queries together and this Relation class is at the heart of the new query syntax. Let's take a look at this class by searching through the ActiveRecord source code for a file called relation.

Is ActiveRecord an ORM?

ActiveRecord is an ORM. It's a layer of Ruby code that runs between your database and your logic code. When you need to make changes to the database, you'll write Ruby code, and then run "migrations" which makes the actual changes to the database.


1 Answers

There are 5 options that could be considered as implementations of «Hash notation» (the last two are kinda hash-ish):

  1. With Ruby on Rails 5 you are able to do the following chaining using ActiveRecord::Relation#or method:

    Person.where(name: 'Neil').or(Person.where(age: 27)) 
  2. Use where_values together with reduce. The unscoped method is necessary only for Rails 4.1+ to ensure default_scope is not included in the where_values. Otherwise predicates from both default_scope and where would be chained with the or operator:

    Person.where(    Person.unscoped.where(name: ['Neil'], age: [27]).where_values.reduce(:or)  ) 
  3. Install third-party plugins that implement these or similar features, for example:

    • Where Or (backport of the Ruby on Rails 5 .or feature mentioned above)

    • Squeel

      Person.where{(name == 'Neil') | (age == 27)}  
    • RailsOr

      Person.where(name: 'Neil').or(age: 27) 
    • ActiverecordAnyOf

      Person.where.anyof(name: 'Neil', age: 27) 
    • SmartTuple

      Person.where(   (SmartTuple.new(' or ') << {name: 'Neil', age: 27}).compile ) 
  4. Use Arel:

    Person.where(    Person.arel_table[:name].eq('Neil').or(     Person.arel_table[:age].eq(27)   )  ) 
  5. Use prepared statements with named parameters:

    Person.where('name = :name or age = :age', name: 'Neil', age: 27) 
like image 147
potashin Avatar answered Sep 22 '22 19:09

potashin