2010-07-15 9 views
2

En ce moment, je fais mes requêtes complexes à la main pour ainsi dire. Mais je continue à rencontrer des problèmes. Par exemple.Convertir une requête SQL en Rails

  query = "SELECT histories.candidate_id 
      FROM histories 
      WHERE histories.institution_id IN (?) 
      GROUP BY histories.candidate_id 
      HAVING COUNT(*)= ?" 
      cand = [Code.find_by_sql([query, 

params['searches'][key], params['searches'][key].size])]

class History < ActiveRecord::Base 
    belongs_to :candidate 
end 
    create_table "histories", :force => true do |t| 
    t.string "job_title" 
    t.date  "start_date" 
    t.date  "finish_date" 
    t.string "basic_salary" 
    t.string "bonus" 
    t.integer "institution_id" 
    t.integer "candidate_id" 
    t.datetime "created_at" 
    t.datetime "updated_at" 
    end 
class Candidate < ActiveRecord::Base 
    # has_and_belongs_to_many :codes 
    has_many :codes, :through => :CandidatesCodes 
    has_many :histories 
    has_many :contacts 
    has_many :compensations 
end 

Ceci retourne une liste des ids candidats .. mais veux je veux que ce retour est une liste de candidats comment pourrais-je faire les rails ainsi?

C'est la suggestion de Brians, et je l'ai essayé mais je reçois non initialisée Histoire constante des candidats

 cand = History.find(:all, 
     :joins => :candidates, 
     :select => "candidates.*", 
     :conditions => [ "institution_id IN (?)", params['searches'][key] ], 
     :group => [ "candidate_id HAVING count(*) = ?", params['searches'][key].size ] 
    ) 
+0

Pouvez-vous poster votre code de modèle Histoire & Candidat pour voir les relations (peut-être un regard @ vos migrations aiderait aussi). – Brian

+0

Je pense que votre problème réside dans la relation belongs_to dans le modèle History. Les candidats doivent être singuliers. – Brian

Répondre

1

Essayez ceci:

Candidate.all(
    :joins => :histories, 
    :conditions => {:histories=> {:institution_id => params[:searches][key]}}, 
    :group => "candidates.id", 
    :having => "count(candidates.id) >= %i" % params[:searches][key].size 
) 

Cela devrait générer le code SQL suivant:

SELECT candidates.* 
FROM  candidates AS candidates 
JOIN  histories AS histories ON histories.candidate_id = candidates.id 
WHERE histories.institution_id IN (1,2,3) 
GROUP BY candidates.id 
HAVING COUNT(candidates.id) >= 3 
+0

Mysql :: Erreur: Vous avez une erreur dans votre syntaxe SQL, consultez le manuel correspondant à la version de votre serveur MySQL la bonne syntaxe à utiliser près de '? 1' à la ligne 1: SELECT des candidats. * FROM 'histories' INNER JOIN 'candidates' SUR' candidates'.id = 'histories'.candidate_id WHERE (institution_id IN (' 1 ')) GROUP BY candidate_id HAVING count (*) =? 1 –

+0

J'ai mis à jour ma réponse car il y avait une erreur de syntaxe. Le SQL que vous avez listé ne correspond pas au SQL généré par la solution que j'ai suggérée. –

+0

Génial merci beaucoup qui a fonctionné parfaitement, même si j'ai dû changer> 3 à> = –

0

Essayez ceci.

En supposant que vous avez le mode d'histoire

History.find(:all , 
    :conditions=>[" institution_id IN (?) ",params['searches'][key] ], 
    :group => ["candidate_id HAVING count(*) = ? " ,params['searches'][key].size ] 
) 
+0

Je pense que l'auteur cherche à obtenir des informations sur les candidats qui nécessiteraient une sorte de jointure. Je pense que nous avons besoin d'une sorte d'information supplémentaire sur le schéma et les relations entre les modèles avant de fournir une réponse complète. – Brian

+0

J'ai essayé cela, et je reçois "vous avez une erreur dans votre syntaxe sql '? 1' à la ligne 1: SELECT * FROM 'histories' WHERE (institution_id IN (' 1 ')) GROUPE BY candidat_id HAVING count (*) =? 1 –

1

pour cette solution (bâtiment sur l'approche de Dinesh ci-dessus.

candidates = History.find(:all, 
    :joins => :candidates, 
    :select => "candidates.*" 
    :conditions => ["institution_id IN (?)", params['searches'][key]], 
    :group => ["candidate_id HAVING count(*) = ?", params['searches'][key].size] 
) 

Avertissement - non testé

+0

J'ai essayé cela, mais je ne suis pas initialisé constante Histoire :: Candidats –

+0

Oups, remarqué quelque chose ... Dans votre modèle d'histoire, appartient à: les candidats doivent être appartenant à: candidat (pas pluriel). – Brian

+0

Je ne sais pas si cela fera une différence, mais je suis dans le contrôleur des recherches –

Questions connexes