boolean为false且属性存在的文章 - Rails 4

时间:2015-12-27 23:23:17

标签: ruby-on-rails ruby ruby-on-rails-4 activerecord

我有一个Article模型,其中包含approved?布尔值和short_answer文本列。

找到批准为false并且存在short_answer的文章的最佳方法是什么?

我知道您可以使用以下内容检查两个条件:

Article.where(:approved => false, :short_answer => "")

但不确定如何确保short_answer为present?

5 个答案:

答案 0 :(得分:1)

试试这个(使用Rails 3.2或更高版本):

Article.where(approved: false).
  where('aticles.short_answer IS NOT NULL')

或者这个(仅限ActiveRecord 4或更高版本):

Article.where(approved: false).
  where.not(short_answer: nil)

答案 1 :(得分:1)

  

找到批准为假的文章的最佳方法是什么?   short_answer存在吗?

您可以为个别条件编写scope,以便将来也可以重复使用。

   class Article < ActiveRecord::Base
      scope :all_approved, -> { where(approved: false) }
      scope :all_short_answer, -> { where("articles.short_answer IS NOT NULL") }
   end

   Article.all_approved.all_short_answer

现在有多种方法可以使用where子句编写查询。我现在要分发给你,由你来订阅你想要的宗教信仰。

1。您可以在where

等子句中使用原始SQL查询
scope :all_short_answer, -> { where("short_answer IS NOT NULL") }`

2. 可以将all_short_answer范围重写为

scope :all_short_answer, -> { where(articles.short_answer != nil) }

3。可以使用where.not

scope :all_short_answer, -> { where.not('articles.short_answer' => nil) }

答案 2 :(得分:1)

@article = Article.where(approved: false).where.not(short_answer: nil).first

如果你想扩大范围:

#app/models/article.rb
class Article < ActiveRecord::Base
   scope :approved_short_answer, -> { where(approved:false).where.not(short_answer: nil).first }
end

@article = Article.approved_short_answer

答案 3 :(得分:0)

如果字段为NULL 包含空字符串(present?),则Rails false帮助程序返回""。如果字符串包含一个或多个字符,则返回true。因此,测试short_answer是否为nil是不够的。

所以,对于Rails 4.x:

Article.where(approved: false).where('length(short_answer) > 0')

答案 4 :(得分:0)

您想找到

的文章
  • approved = false
  • short_answer!= null
  • short_answer!=&#34;&#34; (空字符串)

您可以通过ActiveRecord查询界面

进行操作
Article
  .where(approved: false)
  .where.not(short_answer: nil)
  .where.not(short_answer: "")

如果您可以保证short_answer的所有非空值都包含文字,则可以简化此操作。

Article
  .where(approved: false)
  .where.not(short_answer: nil)