2010-05-05 4 views
1

У меня есть модель Reservation, которую я ищу с тремя полями. container_id всегда должен быть self.id, но как confirmed и auto_confirmed только одно должно быть правдой. У меня есть следующее, но оно не выполняет то, что мне нужно:Rails найти: условия

Reservation.find(:all, 
:conditions => ['container_id = ? AND confirmed = ? OR auto_confirm = ?', 
self.id, true, true,]) 

Как это изменить?

ответ

6

Я не уверен, что я получаю вашу проблему, но от того, что я понимаю, что это будет работать:

Reservation.find(:all, 
:conditions => ['container_id = ? AND (confirmed = ? OR auto_confirm = ?)', 
self.id, true, true,]) 
+0

это не будет работать, если оба являются истинными. – Salil

+0

так, как заставить его работать, когда оба являются истинными? – s84

+0

Это работает для меня, когда оба истины. – s84

3

Согласно подтвердили ваш вопрос и auto_confirmed только нужно, чтобы быть правдой. Так что используйте следующие

Reservation.find(:all, 
       :conditions => ['container_id = :container AND 
        ((confirmed = :flag and auto_confirm != :flag) || 
        (confirmed != :flag and auto_confirm = :flag))', 
        {:container=> self.id, :flag=>true}] 
       ) 
+0

+1 для ответа в соответствии с вопросом. – Aditya

+0

Спасибо за ваш ответ, но он не завершил работу так просто, как тот, который я проверил - и, конечно, это зависит от того, как я сформулировал этот вопрос. Но плюс один для вашего ответа спасибо! – s84

0

Я думаю, что-то вроде этого:

Reservation.find(:all, 
:conditions => ['container_id = ? AND ((confirmed != true AND auto_confirm = true) OR (confirmed = true AND auto_confirm != true))', 
self.id]) 
+0

это не будет работать с подтвержденным = false И auto_confirm = null, например. – Salil

+0

значениями по умолчанию для подтвержденных и auto_confirm являются: false – s84

+0

изменен для работы как вам нравится – dombesz

0

Я не уверен, если это база данных агностик, но вы можете попробовать

Reservation.find(:all, 
:conditions => ['container_id = ? AND confirmed = ? **XOR** auto_confirm = ?', 
self.id, true, true,]) 
0

То, что вы говорите, не соответствует действительности - такой запрос, как

SELECT * FROM foos WHERE content_id = 345 AND (confirm = 1 OR auto_confirm = 1) 

выберет строки, в которых оба столбца «confirm» установлены в 1 (и ActiveRecord создает столбцы tinyint для булевых элементов и проверяет их на 1 и 0).

Если вы имеете в виду «найти все строки, соответствующие на content_id и имеющие подтвердить или auto_confirmed верно, но не то и другое» тогда вы дошли до запроса, как этот

SELECT * FROM foos WHERE content_id = 345 AND ((confirmed = 1 AND auto_confirm = 0) OR (confirmed = 0 AND auto_confirm = 1)) 

который вы перефразировать в AR условиях как этот

Reservation.find(:all, 
    :conditions => [ 
     'container_id = ? AND ((confirmed = 1 AND auto_confirm != 1) OR (confirmed = 0 AND auto_confirm != 1))', 
     self] 
) 

Однако, судя по именам ваших полей вы на самом деле реализации государственной машины с отдельными колоннами, которые будут приносить вам боль, так что я бы исследовать что-то, что даст вам прогрессией состояний вместо проверки отдельных битов включения и выключения.

+0

над моей головой, но его достаточно просто для прямо сейчас. – s84