Предложение ActiveRecord OR в запросе с областью действия - PullRequest
0 голосов
/ 24 сентября 2011
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 })

Учитывая приведенный выше код, можно ли добавить предложение OR к :conditions, чтобы сказать что-то вроде

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

Ответы [ 2 ]

0 голосов
/ 24 сентября 2011

Вы можете использовать условие SQL вместо условия хеширования:

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'
    ]
)

Или:

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' }
    ]
)

Недостатком является то, что вы должны избегать попытки pets.is = NULL вручную.

0 голосов
/ 24 сентября 2011

Вы можете сделать следующее, используя MetaWhere gem

statuses = %w(sick healthy hungry)

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

Символ | используется для условия OR.

PS : директива include использует LEFT OUTER JOIN, поэтому нет необходимости вручную кодировать JOIN.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...