2

私は持っている:

class Evaluation < ActiveRecord::Base
  has_many :scores
end
class Score < ActiveRecord::Base
  scope :for_disability_and_score,
        lambda { |disability, score|
          where('total_score >= ? AND name = ?', score, disability)
        }
end

scoresテーブルにはフィールドtotal_scoreとフィールドがありnameます。

「ビジョン」という名前で 2 の評価を持ち、「ヒアリング」という名前で 3 の別の評価を持っているものだけを求める a をどのように書くことができますscopeか。私のパラメータで?evaluationsScoretotal_scoreScoretotal_score

生のSQLでは、次のようになります。

I managed to do it in raw sql:

sql = %q-SELECT "evaluations".*
FROM "evaluations"
INNER JOIN "scores" AS s1 ON "s1"."evaluation_id" = "evaluations"."id"
INNER JOIN "target_disabilities" AS t1 ON "t1"."id" = "s1"."target_disability_id"
INNER JOIN "scores" AS s2 ON "s2"."evaluation_id" = "evaluations"."id"
INNER JOIN "target_disabilities" AS t2 ON "t2"."id" = "s2"."target_disability_id"
WHERE "t1"."name" = 'vision' AND (s1.total_score >= 1)
      AND "t2"."name" = 'hearing' AND (s2.total_score >= 2)-

ここでのポイントは、これを繰り返すことです:

INNER JOIN "scores" AS s1 ON "s1"."evaluation_id" = "evaluations"."id"

そしてこれ(s1をs2とs3に置き換えるなど):

WHERE (s1.total_score >= 1)

しかし、それはこれを行うレールの方法でなければなりません... :)うまくいけば

4

1 に答える 1

0

これを試して:

scope :by_scores, lambda do |params|
    if params.is_a? Hash
      query = joins(:scores)
      params.each_pair do |name, score|
        query = query.where( 'scores.total_score >= ? AND scores.name = ?', score, name)
      end
      query
    end
 end

次に、次のように呼び出します。

Evaluation.by_scores 'vision' => 2, 'hearing' => 3
于 2012-04-30T11:26:24.350 に答える