代码之家  ›  专栏  ›  技术社区  ›  Sam å±±

Rails查找:条件

  •  1
  • Sam å±±  · 技术社区  · 14 年前

    我有一个 Reservation 我正在用三个字段搜索的模型。这个 container_id 必须始终是 self.id 但作为 confirmed auto_confirmed 只有一个需要真实。我有以下功能,但它不能满足我的需要:

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

    我该怎么换这个?

    5 回复  |  直到 14 年前
        1
  •  6
  •   marcgg    14 年前

    我不确定我是否理解你的问题,但根据我的理解,这是可行的:

    Reservation.find(:all, 
    :conditions => ['container_id = ? AND (confirmed = ? OR auto_confirm = ?)', 
    self.id, true, true,])
    
        2
  •  3
  •   Salil    14 年前

    根据你的问题确认和自动确认,只有一个需要是真的。所以使用下列

    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
  •  0
  •   Tadas T    14 年前

    我不确定这是否是数据库不可知论,但你可以试试

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

    你说的不是真的-一个像

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

    将选择两个“确认”列都设置为1的行(并且ActiveRecord为布尔值创建tinyint列并检查1和0)。

    如果你是说 “查找与内容\u id匹配且已确认或自动\u确认为真的所有行,但不能同时查找两者” 然后你会遇到这样的问题

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

    你用这样的术语改写了它

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

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

        5
  •  0
  •   dombesz    14 年前

    我想是这样的:

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