2011-01-07 34 views
1

我有一個簡單的範圍問題。我想這樣做的範圍:在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] 
    } 

的問題是,我只想當所最近響應失敗。我敢肯定,這是一種用花式排序或某種嵌套查詢來做到這一點的方法,但我被卡住了。謝謝!

回答

1

我可以在那一刻想到的唯一的事情就是範圍內的子查詢:

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

我想有某種Rails的方式,是更好一點或無子查詢的方式,但我目前無法想到它。希望這有助於。 :)

0

我想說清楚比聰明。有一個實例方法來返回該單篇文章的last_reponse,然後讓另一個實例方法返回布爾值是true還是false。它可能不如單行SQL的名稱範圍。但我仍然以更好的可維護性/理解的方式去做。