【问题标题】:Rails scope for IS NOT NULL and is not empty/blank?Rails 范围为 IS NOT NULL 且不为空/空白?
【发布时间】:2012-01-27 01:53:18
【问题描述】:

我的范围如下:

scope :comments, :conditions => ['text_value IS NOT NULL']

但我也希望条件说“OR text_value IS NOT EMPTY”(或类似的意思)。

我不想选择text_value 为空/空白的任何行。

【问题讨论】:

    标签: sql ruby-on-rails postgresql scope


    【解决方案1】:

    我个人是这样的:

    1) 添加到初始化器

    class Arel::Attributes::Attribute
      # Encode column name like: `posts`.`author_id`
      def to_sql
        "`#{relation.table_name}`.`#{name}`"
      end
    
      def is_not_empty
        "#{to_sql} <> ''"
      end
    end
    

    2) 添加到您的模型中

    scope :comments, -> { where(arel_table[:text_value].is_not_empty) }
    

    祝你好运!

    【讨论】:

      【解决方案2】:

      正如 Erwin 所指出的,在这种情况下,一个简单的 text_value &lt;&gt; '' 比较将起作用。

      scope :comments, where("text_value <> ''")
      

      (Rails 3 更喜欢scope 以及findall 等的这种查询语法,而不是选项哈希,例如:conditions =&gt; ...。后者是deprecated in Rails 3.1。)

      在 Rails 4 中,第二个参数应该是 lambda:

      scope :comments, ->{ where("text_value <> ''") }
      

      【讨论】:

      • COALESCE() 在这种情况下显得很笨拙,因为NULL &lt;&gt; '' 会产生NULL。只有TRUE 条件限定一行。
      • 怎么样--scope :cmets, where("NOT text_value IS NULL")
      • 在 Rails 5 中我会做 where.not(text_value: [nil, ""])
      【解决方案3】:

      在 Rails 4 中你可以这样做

      where.not(text_value: '')
      

      【讨论】:

      • 美丽的解决方案。
      • 绝对是 Rails 4 及更高版本的最佳答案
      • 这不会返回 text_value 为 nil 的行吗?
      • 不,在后台 ActiveRecord 将生成与此处大多数其他答案相同的 SQL (text_value &lt;&gt; '')。诚然,这有点 SQL 的魔力……
      • @PatrickOscity 不过,这就是首先使用 ORM 背后的想法。
      【解决方案4】:

      导轨 4

      scope :comments, -> { where.not(:text_value => nil) }
      

      【讨论】:

      • 作为原始问题请求工作。
      • 同意@Backo 但澄清一下,这不会过滤掉空白,只会过滤掉 nils。
      【解决方案5】:
      scope :comments, where("text_value <> ''")
      

      【讨论】:

      • OR 是错误的运算符。这将接受一个空的text_value
      • 是的,空的 text_value 也不是 NULL ;) - 现在已更正,谢谢
      • 现在是正确的。但是您不需要额外的测试text_value IS NOT NULL。请参阅我的回答和其他评论。运算符 &lt;&gt;!= 对于字符类型(以及大多数其他类型)是相同的。
      • 我现在看到了——它很有趣而且非常有用。谢谢你,先生
      【解决方案6】:

      使用text_value &lt;&gt; '' 有效地涵盖两种情况。

      对于既不是NULL 也不是emptytext_value 只会是TRUE

      【讨论】:

        猜你喜欢
        • 2018-11-25
        • 1970-01-01
        • 2022-11-21
        • 1970-01-01
        • 1970-01-01
        • 2020-03-22
        • 2016-01-31
        • 1970-01-01
        • 2021-02-03
        相关资源
        最近更新 更多