2013-10-17 7 views
0

J'ai une application qui enregistre les appels. Chaque appel peut avoir plusieurs unités associées. Une partie de mon application a une section de rapports qui effectue simplement une requête sur le modèle d'appel pour différents critères. J'ai trouvé comment écrire des portées qui font ce que je veux et les enchaîner aux résultats de ma fonctionnalité de recherche de rapports. Mais je ne peux pas comprendre comment rechercher par "unité". Voici des extraits pertinents de mon code:Portée avec association et ActiveRecord

Call.rb 

    has_many :call_units 
    has_many :units, through: :call_units 

     #Report search logic 
      def self.report(search) 
      search ||= { type: "all" } 

      # Determine which scope to search by 
      results = case search[:type] 
         when "open" 
         open_status 
         when "canceled" 
         cancel 
         when "closed" 
         closed 
         when "waitreturn" 
         waitreturn 
         when "wheelchair" 
         wheelchair 
         else 
         scoped 
         end 

#Search results by unit name, this is what I need help with. Scope or express otherwise?   
results = results. ?????? 

      results = results.by_service_level(search[:service_level]) if search[:service_level].present? 
      results = results.from_facility(search[:transferred_from]) if search[:transferred_from].present? 
      results = results.to_facility(search[:transferred_to]) if search[:transferred_to].present? 

      # If searching with BOTH a start and end date 
      if search[:start_date].present? && search[:end_date].present? 
       results = results.search_between(Date.parse(search[:start_date]), Date.parse(search[:end_date])) 

       # If search with any other date parameters (including none) 
      else 
       results = results.search_by_start_date(Date.parse(search[:start_date])) if search[:start_date].present? 
       results = results.search_by_end_date(Date.parse(search[:end_date])) if search[:end_date].present? 
      end 

      results 
      end 

Depuis que je suis une association pour les unités déjà, je ne sais pas si je dois faire un champ pour les unités d'une façon ou d'exprimer les résultats en quelque sorte dans la variable des résultats dans mon logique de recherche.

+0

autant de code, mais je n'ai toujours aucune idée de ce que vous demandez. Que devrait faire 'by_unit_name'? pourquoi affichez-vous tout ce qui n'a rien à faire de ce que vous voulez vraiment? S'il vous plaît faites un exemple minimal d'où votre problème réside et publiez-le ici. – phoet

+0

Je cherche à créer une variable de résultat qui me permettra d'effectuer une recherche par nom d'unité. Ainsi, dans ma vue de rapport, je peux sélectionner un nom d'unité et filtrer les résultats d'appel par nom d'unité. Je ne suis pas vraiment sûr si j'ai besoin d'écrire une portée pour le faire ou si je peux exprimer cela dans une variable de résultats. J'ai enlevé le code supplémentaire et j'ai commenté où j'ai besoin d'aide. – nulltek

Répondre

1

Fondamentalement, vous voulez une portée qui utilise une jointure afin que vous puissiez utiliser un critère where par rapport au modèle associé? Est-ce exact?

Donc dans SQL vous cherchez quelque chose comme

select * from results r 
    inner join call_units c on c.result_id = r.id 
    inner join units u on u.call_unit_id = c.id 
    where u.name = ? 

et la portée serait (de mémoire, je ne l'ai pas débogué cela) quelque chose comme:

scope :by_unit_name, lambda {|unit_name| 
    joins(:units).where('units.unit_name = ?', unit_name) 
} 

units.name n'est pas une colonne dans le db. Le changer en units.unit_name n'a pas déclenché d'exception et semble être ce que je veux. Voici ce que j'ai dans mes résultats variables:

results = results.by_unit_name(search[:unit_name]) if search[:unit_name].present? 

Lorsque je tente de rechercher par un nom d'unité différente aucun résultat apparaissent. Voici le code que j'utilise pour rechercher:

<%= select_tag "search[unit_name]", options_from_collection_for_select(Unit.order(:unit_name), :unit_name, :unit_name, selected: params[:search].try(:[], :unit_name)), prompt: "Any Unit" %> 
+0

pouvez-vous poster le journal de requête pour la recherche? Vous devriez être en mesure de voir le SQL exact que les rails tentent d'exécuter (en supposant que vous êtes en cours d'exécution dans l'environnement de développement). – GSP

+0

SELECT "appels". * FROM "appels" INNER JOIN "call_units" ON "call_units". "Call_id" = "appels". "Id" INNER JOIN "call_units" "call_units_calls_join" ON "call_units_calls_join". "Call_id" = " appelle "." id "INNER JOIN" unités "ON" unités "." "id" = "call_units_calls_join". "unit_id" WHERE (units.unit_name = '1') COMMANDER PAR incident_number ASC LIMIT 10 OFFSET 0 – nulltek

+0

Je pense que le problème est-ce la sélection où unit_name est égal à unit.id qui est un entier et non la chaîne. Alors peut-être que mon code select_tag est faux? – nulltek

Questions connexes