0

テーブルからフェッチした一連の行があります。オブジェクトの評価としましょう。このオブジェクトを取得した後、データベースから 100 個のエントリを取得しました。

評価オブジェクトは次のようになります。

table_ratings
t.integer :num

そこで、私が今やりたいことは、他のクエリを実行せずに、これらの 100 行に対していくつかの計算を実行することです。追加のクエリを実行して、これを行うことができます。

r = Rating.all
good = r.where('num = 2') # this runs an additional query
"#{good}/#{r.length}"

これは私がやりたいことの非常に大まかなアイデアであり、作成する他のより複雑な出力があります。これらの行に対して実行する必要がある 10 を超える異なる計算があり、SQL クエリでこれらのエイリアスを作成することは最善の方法ではない可能性があるとします。

上記の r.where クエリを置き換える効率的な方法は何でしょうか? ActiveRecord Association コレクション オブジェクトへの同様のクエリ API を提供する Ruby メソッドまたは gem はありますか?

4

1 に答える 1

2

Rating.all は、すべての Rating オブジェクトの配列を返します。そこから、配列からの選択とマッピングに焦点を移します。例えば。:

@perfect_ratings = r.select{|x| x.a == 100}

見る:

http://www.ruby-doc.org/core-1.9.3/Array.html

追加コメント:

配列で使用できるメソッドのリストを調べてみると、次のメソッドを頻繁に使用していることに気付きました。

複数の値に対して変数をチェックするには:

%w[dog cat llama].include? @pet_type  # returns true if @pet_type == 'cat'

別の配列を作成するには (map と collect はエイリアスです):

%w[dog cat llama].map(|pet| pet.capitalize)  #  ["Dog", "Cat", "Llama"]

重複をソートしてドロップするには:

%w[dog cat llama dog].sort.uniq  # ["cat", "dog", "llama"]

<<要素を+追加する、配列を追加する、flatten埋め込み配列を 1 つのレベルの配列にフラット化する、countまたは要素数を増やすlengthなど、私がよく使用するその他の機能です。sizejoin

最後に、次の例を示しjoinます。

%w[dog cat llama].join(' or ')  # "dog or cat or llama"
于 2012-06-20T14:20:57.010 に答える