ActiveRecord OR cláusula en la consulta de ámbito

statuses = %w(sick healthy hungry) query = User.scoped(:joins => 'left outer join pets on pets.user_id = users.id', :conditions => { 'pets.id' => nil, 'users.job_status' => stati }) 

Dado el código anterior, es posible agregar una cláusula OR a las :conditions para decir algo como

 where (pets.id is NULL AND users.status IN ('sick', 'healthy', 'hungry')) OR (users.gender = 'male') 

Puedes hacer lo siguiente usando la gem MetaWhere

 statuses = %w(sick healthy hungry) query = User.include(:pets).where( ('pets.id' => nil, 'users.job_status' => statuses) | ('users.gender' => 'male') ) 

El | el símbolo se utiliza para la condición OR

PD : la directiva de include utiliza LEFT OUTER JOIN por lo que no es necesario codificar manualmente JOIN.

Podría usar una condición de SQL en lugar de una condición de hash:

 query = User.scoped( :joins => 'left outer join pets on pets.user_id = users.id', :conditions => [ '(pets.id is null AND users.status IN (?)) OR (users.gender = ?)', statuses, 'male' ] ) 

O:

 query = User.scoped( :joins => 'left outer join pets on pets.user_id = users.id', :conditions => [ '(pets.id is null AND users.status IN (:statuses)) OR (users.gender = :gender)', { :status => statuses, :gender => 'male' } ] ) 

El inconveniente es que tienes que evitar intentar con pets.is = NULL a mano.