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

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

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] } 

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

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

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

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

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