1

製品テーブルとその製品のバリエーションのセットがあります。特定の製品のすべてのバリエーションをロードしてから、個々のレコードを更新したいと思います。

つまり、製品Xに100のバリエーションがあり、バリエーションの1つを編集したいとします。製品に存在するすべてのバリエーションを照会します。

vars = Variation.where(:product_id => 1) # => select * from variations
                                         #       where product_id = 1

count = 1を選択し
、最初のレコード
更新カウント=1を調整します

ここで、id = 10であるこのコレクションのレコードを編集したいのですが、データベースに戻ってレコードをプルダウンしたくありません。どして私がこんな事に?私は最初の選択からすでにそれをメモリに持っていますよね?

また、レコードから少しデータを読み取りたいと思うかもしれません。バリエーションの価格を言います。

私は間違いなく、すでにメモリにあるデータをデータベースに照会したくありません。

4

2 に答える 2

3

結果セットは列挙可能なものを実装しているので、次のような楽しいことを行うことができます。

my_collection = vars.find_all { |var| var.product_id == 10 }

これにより、サブセットが配列として生成され、必要な処理を続行できます。

于 2012-05-22T00:45:13.793 に答える
1

に基準を渡すとwhere、データベースから一致するレコードのみを取得するクエリを作成するようにActiveRecordに指示しているため、要求したときにVariation.where(:product_id => 1)、product_idが10のレコードをメモリにロードしていないことは間違いありません。

本当にすべてのレコードをメモリにロードしてから更新する場合は、を使用Variation.allして結果を反復処理する必要があります。特定のproduct_id値にはバリエーションが1つしかないことがわかっている場合は、product_idsをキーとしてハッシュにそれらをロードすることもできますHash[ Variation.all.map{|v| [v.id, v]} ]

編集

これは元の質問に完全には対応していませんでした。「id」でそれを取得できなかったため、Daveは実際には「product_id」ではなく「id」を意味していました。ハッシュトリックが答えの点でまだ役に立ったことを嬉しく思います。

于 2012-05-22T00:40:46.650 に答える