【问题标题】:rails active record - complicated conditions clauserails active record - 复杂条件子句
【发布时间】:2010-01-10 02:24:26
【问题描述】:

这行得通:

ids = [1,2]
varietals = Varietal.find(:all, :conditions => [ "id IN (?)",ids])

但我想做的是,加上一个条件:deleted => false

varietals = Varietal.find(:all, :conditions =>{ :deleted => false})

有什么想法吗?

我必须使用 find_by_sql 吗?

【问题讨论】:

    标签: ruby-on-rails activerecord


    【解决方案1】:

    我会使用 named_scope 来处理这个问题,以传达意图并促进重用:

    named_scope :undeleted,
                :conditions => { :deleted => false }
    

    那么你可以简单地使用:

    varietals = Varietal.undeleted.find([1,2])
    

    【讨论】:

      【解决方案2】:

      您可以通过几种方式做到这一点,但这是最直接的:

      varietals = Varietal.find( [1,2], :conditions => { :deleted => false })
      

      可以see in the docsfind的第一个参数可以是整数也可以是数组。

      【讨论】:

      • 这种方法sql注入安全吗?看起来 AR 无论如何我都不会做准备好的语句,所以不确定 AR 如何防止 sql 注入
      • 是的,这条语句是 SQL 注入安全的。它只允许一个整数或一个整数数组或多或少。只要您遵循正确的约定来调用您的 AR 查找,您的查询将是安全的。 (即不要这样做::conditions => 'deleted = #{@deleted}' 而不是 :conditions => {:deleted => @deleted} 或类似的东西。
      【解决方案3】:
      ids = [1,2]
      varietals = Varietal.find(:all, :conditions => {:id => ids, :deleted => false})
      

      这应该可以,但还没有测试过。

      来自docs

      可以在哈希中使用一个数组来 使用 SQL IN 运算符:

      Student.find(:all, :conditions => { :grade => [9,11,12] })
      

      【讨论】:

      • 这个也可以,但是 Doug Neiner 的那个更简洁
      • 确实如此,对于这种情况可能是更好的选择。但是您应该庆幸您现在知道如何在哈希中对多个条件进行分组! ;)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多