Rails 3 fields_for chargement agressif?
-
13-10-2019 - |
Question
Je suis en train de optimize (limite) les requêtes en vue. J'utilise le fields_for fonction. Je dois faire référence à différentes propriétés de l'objet, comme nom d'utilisateur à des fins d'affichage. Cependant, ceci est une table rel, donc je dois joindre à ma table d'utilisateurs. Le résultat est N sous-requêtes, 1 pour chaque champ fields_for . Il est difficile d'expliquer, mais je pense que vous comprendrez ce que je me demande si je colle mon code:
<%= form_for @election do |f| %>
<%= f.fields_for :voters do |voter| %>
<%= voter.hidden_field :id %>
<%= voter.object.user.preferred_name %>
<% end %>
<% end %>
J'ai comme 10.000 utilisateurs, et plusieurs fois chaque élection comprendra tous les 10.000 utilisateurs. C'est à chaque fois 10.000 sous-requêtes ce point de vue est chargé. Je veux fields_for JOIN sur les utilisateurs. Est-ce possible?
Je voudrais faire quelque chose comme:
...
<%= f.fields_for :voters, :joins => :users do |voter| %>
...
<% end %>
...
Mais, bien sûr, ne fonctionne pas: (
La solution
vous pouvez simplement faire en sorte que la relation des électeurs se joint toujours avec les utilisateurs du modèle électoral.
class Election < ActiveRecord::Base
has_many :voters, :include => :users
end
Lire la documentation Rails sur les associations et les options supplémentaires vous pouvez fournir lors de la déclaration des relations dans le modèle.
Autres conseils
Alors, je ne sais pas comment faire, mais j'ai trouvé un moyen de contourner. Je l'emportaient sur election.voters dans mon modèle à revenir rejoint les utilisateurs ...
Vous pouvez également créer un champ nommé qui relie les utilisateurs
class Election < ActiveRecord::Base
has_many :voters
scope :with_voters, :include => :voters
…
end
vous pouvez alors utiliser quelque chose comme Election.with_voters.first