代码之家  ›  专栏  ›  技术社区  ›  Garfield

Rails:使用名为“u scope”的工具,它会触发mysql“in”

  •  2
  • Garfield  · 技术社区  · 16 年前

    问题:

    我想运行一个查询,它将触发

    select * from users where code in (1,2,4);
    

    使用A named_scope .


    我尝试过:

    这是一个代码:

    named_scope :of_code, lambda {|code| {:conditions => ["code = ?", code]}}
    

    我试过类似的东西

    named_scope :of_codes, lambda {|codes| {:conditions => ["code in ?", codes]}}
    

    并发送

    user.of_codes('(1,2,4)')
    

    它触发 select * from users where code in '(1,2,4)' 这会导致MySQL错误,因为有多余的引号。

    PS: 理想情况下我想寄 user.of_codes([1,2,4])

    3 回复  |  直到 16 年前
        1
  •  4
  •   James A. Rosen    16 年前

    这将有效,只需找到并不会使您暴露于SQL注入攻击:

    named_scope :of_codes, lambda { |codes|
      { :conditions => ['code in (?)', codes] }
    }
    
    User.of_codes([1, 2, 3])
    # executes "select * from users where code in (1,2,3)"
    

    如果你想更圆滑一点,你可以这样做:

    named_scope :of_codes, lambda { |*codes|
      { :conditions => ['code in (?)', [*codes]] }
    }
    

    然后你可以用 Array (如上): User.of_codes([1, 2, 3]) 或使用代码参数列表: User.of_codes(1, 2, 3) .

        2
  •  3
  •   Michał Szajbe    16 年前

    最简单的方法是对条件使用哈希而不是数组:

    named_scope :of_codes, lambda { |*codes| { :conditions => { :code => codes } } }
    

    这将按预期工作。

    User.of_codes(1, 2, 3) # => SELECT ... code IN (1,2,3)
    User.of_codes(1) # => SELECT ... code IN (1)
    
        3
  •  2
  •   Salil    16 年前

    你可以试试下面的

    named_scope :of_codes, lambda {|codes| {:conditions => ["code in "+codes]}}
    

    user.of_codes('(1,2,4)')
    

    为SQL注入问题使用而编辑

    named_scope :of_codes, lambda {|codes| {:conditions => ["code in (?) ", codes]}}
    

    user.of_codes([1,2,4])
    
    推荐文章