Rails发现:条件

时间:2010-05-05 12:50:55

标签: mysql ruby-on-rails find logic conditional-statements

我有一个Reservation模型,我正在搜索三个字段。 container_id必须始终为self.id,但confirmedauto_confirmed只需要一个为真。我有以下但是它没有执行我需要的东西:

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

我该如何更改?

5 个答案:

答案 0 :(得分:6)

我不确定我是否遇到了问题,但据我所知,这会有用:

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

答案 1 :(得分: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}]
               )

答案 2 :(得分:0)

我认为是这样的:

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

答案 3 :(得分:0)

我不确定这是否与数据库无关,但您可以尝试

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

答案 4 :(得分: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]
  )

但是,从您的字段名称判断,您实际上是在实现一个具有单独列的状态机,这会给您带来痛苦,所以我会研究一些可以提供状态进展的东西,而不是检查单独的on和off位