1
Tag.joins(:quote_tags).group('quote_tags.tag_id').order('count desc').select('count(tags.id) AS count, tags.id, tags.name')

Build query:
SELECT count(tags.id) AS count, tags.id, tags.name FROM `tags` INNER JOIN `quote_tags` ON `quote_tags`.`tag_id` = `tags`.`id` GROUP BY quote_tags.tag_id ORDER BY count desc

結果:

[#<Tag id: 401, name: "different">, ... , #<Tag id: 4, name: "family">]

それは私のためにカウント列を返しません。どうすれば入手できますか?

4

2 に答える 2

3

返されたオブジェクトcountの 1 つでメソッドを呼び出してみましたか? Tag言及inspectされてcountいないからといって、そこにないというわけではありません。inspect出力:

[#<Tag id: 401, name: "different">, ... , #<Tag id: 4, name: "family">]

Tagクラスが知っているものだけが含まれ、テーブルTagの列についてだけ知っています。テーブルにはとしかないので、それだけが表示されます。tagsidname

これを行う場合:

tags = Tag.joins(:quote_tags).group('quote_tags.tag_id').order('count desc').select('count(tags.id) AS count, tags.id, tags.name')

次にcountsを見てください:

tags.map(&:count)

期待どおりのカウントの配列が表示されます。

于 2013-08-21T07:22:13.570 に答える
1

更新:この回答の元のバージョンは誤って特徴付けselectられており、その後のバージョンは @muistooshort からの他の回答の現在のバージョンを効果的に繰り返すことになりました。生のSQLの使用に関する情報があるため、現在の状態のままにしています。私のエラーを指摘してくれた@muistooshortに感謝します。

クエリは実際には他の回答で説明されているように機能していますが、代わりに生の SQL をいつでも実行できます。

いろいろなselect_...方法がありますが、ぜひ使っていただきたいと思いますselect_all。暗黙的に生成したビルド クエリが正しいと仮定すると、次のように使用できます。

ActiveRecord::Base.connection.select_all('
  SELECT count(tags.id) AS count, tags.id, tags.name FROM `tags`
    INNER JOIN `quote_tags` ON `quote_tags`.`tag_id` = `tags`.`id`
    GROUP BY quote_tags.tag_id
    ORDER BY count desc')

選択できるさまざまなメソッドについては、http://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/DatabaseStatements.htmlを参照してください。

于 2013-08-21T07:44:08.860 に答える