J'ai plusieurs modèles d'enregistrement actif Rails: ContactEmails, ContactCalls, ContactPostalcards.ce SQL semble donner des résultats bizarres avec plusieurs JOINS, comment puis-je le corriger?
Chacun représente une activité terminée: un courriel, un appel ou une carte postale dûment rempli à un contact spécifique, et chaque contact appartient à une entreprise.
Je veux un résumé de haut niveau par la Compagnie de tous les e-mails, appels et Postalcards dans une plage de dates:
def self.get_list(report_start_date, report_end_date)
self.find :all,
:select => "companies.name AS co_name,
companies.id AS comp_id,
COUNT(contact_emails.id) AS email_count,
COUNT(contact_calls.id) AS call_count,
COUNT(contact_letters.id) AS letter_count,
COUNT(contact_postalcards.id) AS postalcard_count",
:conditions => ['contact_emails.date_sent < ? and contact_emails.date_sent > ? or
contact_calls.date_sent < ? and contact_calls.date_sent > ?',
report_end_date, report_start_date, report_end_date, report_start_date],
:joins => [
"LEFT JOIN companies ON companies.id = contacts.company_id",
"LEFT JOIN contact_emails ON contact_emails.contact_id = contacts.id",
"LEFT JOIN contact_letters ON contact_letters.contact_id = contacts.id",
"LEFT JOIN contact_postalcards ON contact_postalcards.contact_id = contacts.id",
"LEFT JOIN contact_calls ON contact_calls.contact_id = contacts.id"
],
#:group => "companies.id"
:group => "companies.name"
end
Voilà comment je sortie la matrice dans mon point de vue:
<% @matrix_summary.each do |item| %>
<tr>
<td><%= link_to item.co_name, company_path(item.comp_id) %></td>
<td><%= item.email_count %> </td>
<td><%= item.postalcard_count %></td>
<td><%= item.call_count %></td>
<% end %>
</tr>
Mon attente est que chaque ligne doit représenter une société, avec le nombre respectif d'e-mails, de cartes postales et d'appels pour cette société (tous les contacts).
Ce que j'obtiens est la même valeur (et une valeur erronée) pour toutes les activités.
Que fais-je qui ne va pas?
Je vais probablement avoir de nombreuses entreprises - beaucoup de signification pour un utilisateur spécifique 10-20 entreprises, et la requête pourrait être exécutée par plusieurs utilisateurs sur différents ensembles de données .... Je n'ai pas besoin d'utiliser une requête, mais je pensais qu'il pourrait être plus efficace (mais alors, je vais échanger la simplicité pour l'efficacité à ce stade) .... – Angela
ah intéressant - merci pour l'amorce sur les sous-requêtes! – Angela
I +1 parce que cela ressemble à la solution complète - cependant, je pense qu'à ce stade, je penche pour la lisibilité parce que je me rends compte que je suis encore en train de développer tôt, je dois le comprendre plus pour examiner et mettre en œuvre votre solution comme je reçois un meilleur handle .... – Angela