我有两张桌子:
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 %>