我有两张桌子:

create_table "instruments", force: :cascade do |t|
    t.string   "name"
    ...

  create_table "user_instruments", force: :cascade do |t|
    t.integer  "user_id"
    t.integer  "instrument_id"
    ...

与这些关系:
class Instrument < ActiveRecord::Base

  has_many :user_instruments
  has_many :users, :through => :user_instruments

class UserInstrument < ActiveRecord::Base

  belongs_to :user
  belongs_to :instrument

如何查询所有仪器,并提供使用次数的计数器,例如:
Instrument.select('name,User_Instrument.group(:Instrument_id.count')。全部
或者可能:
UserInstrument.includes(:instruments.group('instrument_id as count')。选择('instrument.name,count')
这在视图级别工作,但创建的查询太多:
<% @instruments.each_with_index do |instrument,idx| %>
      ...
    <td><%= instrument.users.count %></td>
      ...
<%end%>

如何使用1个查询来实现这一点?
谢谢

最佳答案

如果只想显示count,那么可以使用to_a方法将其转换为数组,然后对其调用count方法。

# Controller
@instruments = Instrument.all.eager_load(:users)

# View
<% @instruments.each do |instrument| %>
  <td><%= instrument.users.to_a.count %></td>
<% end %>

10-06 06:00