我有一个简单的范围界定问题。我想这样做作为范围:
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]
}
问题是,我只想要最新响应失败的实例。我敢肯定这些是用花式排序或某种嵌套查询来做到这一点的方法,但我卡住了。谢谢!
答案 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的名称范围那么快。但我仍然采用明确的方法来提高可维护性/理解力。