如何列出 Table 的记录以及通过关系使用了多少的计数器

How to list records of a Table with a counter of how many are used through a relationship

我有这两个表:

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').all

或者也许:

UserInstrument.includes(:instruments).group('instrument_id as count').select('instrument.name, count')

这在视图级别有效,但它创建了太多查询:

<% @instruments.each_with_index do |instrument,idx| %>
      ...
    <td><%= instrument.users.count %></td>
      ...
<%end%>

如何用 1 个查询做到这一点?

谢谢

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

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

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