【问题标题】:Rails find :conditionsRails 查找:条件
【发布时间】:2011-02-15 22:17:08
【问题描述】:

我有一个Reservation 模型,我正在搜索它的三个字段。 container_id 必须始终为self.id,但confirmedauto_confirmed 只需其中一个为真。我有以下内容,但它不能满足我的需要:

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

我应该如何改变这个?

【问题讨论】:

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


    【解决方案1】:

    我不确定我是否遇到了您的问题,但据我了解,这会起作用:

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

    【讨论】:

    • 你在逻辑上问“只有一个需要为真”,这意味着两者都为真的行不应该出现在结果集中。为此,请看下面的答案。
    • @sam 如果两者都是真的,那么它也可以工作。然后就看你想要的逻辑了
    • 只有一个必须为真意味着只有一个可以为真,如果两者都为真,则不应工作
    • 只有一个是真实的——在我出轨的思路上——意味着两者都可以是真实的,但只有一个是真实的
    【解决方案2】:

    根据您的问题已确认和 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}]
                   )
    

    【讨论】:

    • 感谢您的回答,但它并没有像我检查的那样简单地完成工作 - 当然这取决于我如何措辞这个问题。但加一个为您的回答谢谢!
    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

      你说的不是真的——像

      这样的查询
        SELECT * FROM foos WHERE content_id = 345 AND (confirm = 1 OR auto_confirm = 1)
      

      将选择两个“确认”列都设置为 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]
        )
      

      但是,从您的字段的名称来看,您实际上是在实现一个带有单独列的状态机,这会给您带来痛苦,所以我会调查一些可以为您提供状态进展的东西,而不是检查单独的开启和关闭位.

      【讨论】:

        【解决方案5】:

        我认为是这样的:

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

        【讨论】:

        • 这不适用于 Confirmed = false AND auto_confirm = null 只是例如。
        • confirm 和 auto_confirm 的默认值为 :false
        猜你喜欢
        • 2011-02-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-12
        • 2013-05-18
        • 2012-08-03
        • 1970-01-01
        • 2011-03-04
        相关资源
        最近更新 更多