2011-01-07 10 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を返すインスタンスメソッドを用意し、それが真か偽かのブール値を返す別のインスタンスメソッドを持たせてください。 SQLの1行で名前スコープと同じくらい高速になることはありません。しかし、私はそれをより良い保守性/理解のための明確な方法でやっています。

関連する問題