在RoR中将简单查询转换为棘手的命名范围

时间:2011-01-07 18:45:23

标签: sql ruby-on-rails activerecord named-scope

我有一个简单的范围界定问题。我想这样做作为范围:

if article.responses.blank?
      return false
elsif article.responses.last.passed.eql?(false)
      return true
else
   return false
end

所以在文章模型上我会有这样的东西:

scope :failed_response, {
    :joins=>[:responses],
    :conditions=>["responses.passed = ?", false]
  }

问题是,我只想要最新响应失败的实例。我敢肯定这些是用花式排序或某种嵌套查询来做到这一点的方法,但我卡住了。谢谢!

2 个答案:

答案 0 :(得分:1)

目前我唯一能想到的是范围内的子查询:

named_scope :failed_response, {
  :conditions => ["(SELECT passed FROM responses WHERE 
     responses.article_id = articles.id ORDER BY id DESC LIMIT 1) = ?", false]
}

我猜有某种Rails方式更好或没有子查询的方式,但我现在想不到它。希望这会有所帮助。 :)

答案 1 :(得分:0)

我要说清楚而不是聪明。有一个实例方法返回该单篇文章的last_reponse,然后让另一个实例方法返回boolean,无论是true还是false。它可能没有单行SQL的名称范围那么快。但我仍然采用明确的方法来提高可维护性/理解力。

相关问题