1

J'ai ces 2 tables:Comment lister les enregistrements d'une table avec un compteur du nombre sont utilisés par une relation

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" 
    ... 

Avec ces relations:

class Instrument < ActiveRecord::Base 

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

class UserInstrument < ActiveRecord::Base 

    belongs_to :user 
    belongs_to :instrument 

Comment interroger tous les instruments, avec un compteur de combien de fois il est utilisé, comme:

Instrument.select ('nom, User_instrument.group (: instrument_id) .count'). tous

ou peut-être:

UserInstrument.includes (instruments): .Groupe ('INSTRUMENT_ID comme count') select ('instrument.name, count')

Cela fonctionne au niveau de la vue. mais il crée trop de requêtes:

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

Comment faire cela avec 1 requête?

Merci

Répondre

1

Si vous voulez montrer à nombre, vous pouvez utiliser la méthode to_a pour le convertir en tableau et ensuite appeler la méthode de comptage sur elle.

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

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

Cela fonctionne. Merci Omkar. – Simon