1

これはどこにも文書化されていませんが、ここに私の問題があります。アクティブなレコードを介してクエリを実行し、「のみ」を使用すると、「順序」句が無視されます。たとえば、ブログ モデルがあります。

Blog.order('id desc')

最も高い ID を持つすべてのブログを最初に返します - 予想通りですが:

Blog.order('id desc').only(:id)

IDのみを返します(予想どおり)が、順序句は完全に無視され、最小のIDが最初に来ます。

これを Ruby 1.9.3p327 と Rails 4.0.0.beta1 と Rails 3.2.13 の両方でテストしたところ、同じ結果が得られました。

これは機能ですか、それともバグですか? Rails の乗組員が find_by_sql は実際には必要ないことを宣伝していたため、私にとってはバグですが、この場合は次のようになります。

Blog.find_by_sql("select id from blogs order by id desc")

これは正しい答えを与えます。

4

1 に答える 1

1

pluckの代わりに使ってみてくださいonlyonly以前に形成されたクエリ チェーンの一部をオーバーライドするために使用されます。ドキュメントが示すように:

Post.where('id > 10').limit(20).order('id desc').only(:order, :where)

結果:

SELECT * FROM posts WHERE id > 10 ORDER BY id DESC

これは、limit渡されたリストに がonly含まれていないため、変更が無視されるため:limitです。

アップデート

ID の配列の代わりに返される実際のモデル オブジェクトが必要な場合は、次を使用しますselect

Blog.order('id desc').select('id')
于 2013-04-03T19:34:21.150 に答える