2013-10-15 7 views
0

Je reçois cette erreur de Heroku,PG :: Erreur: ERREUR: argument WHERE doit être de type booléen, pas de type entier

ce sont mes journaux Heroku.

2013-10-15T19:51:45.703129+00:00 app[web.1]: 19: <% cities = SubjectGradeCity.includes(:city).collect(&:city).uniq %> 
2013-10-15T19:51:45.703129+00:00 app[web.1]: 20: <% grades = SubjectGradeCity.includes(:grade).where(:city_id).collect {|s| {:name => s.grade.name, :id => s.grade.id}}.uniq %> 
2013-10-15T19:51:45.703129+00:00 app[web.1]: ActionView::Template::Error (PG::Error: ERROR: argument of WHERE must be type boolean, not type integer 
2013-10-15T19:51:45.703129+00:00 app[web.1]: LINE 1: ...ade_cities".* FROM "subject_grade_cities" WHERE ("subject_g... 
2013-10-15T19:51:45.703129+00:00 app[web.1]:               ^
2013-10-15T19:51:45.703129+00:00 app[web.1]: 17: <%= simple_form_for :assignments_filter , :html => {:id => "assignments_filter_form"}, :url => {:controller => "requests", :action => "assignments2" } do |f| %> 

ceci est mon code dans les vues


<% cities = SubjectGradeCity.includes(:city).collect(&:city).uniq %> 
<% grades = SubjectGradeCity.includes(:grade).where(:city_id).collect {|s| {:name => s.grade.name, :id => s.grade.id}}.uniq %> 
<% subjects = SubjectGradeCity.includes(:subject).where(:city_id).collect {|s| {:name => s.subject.name, :id => s.subject.id}}.uniq %> 
<% grades.unshift({:name => "You have to select your city first", :id => ""}) if grades.empty? %> 
<% subjects.unshift({:name => "You have to select your city first", :id => ""}) if subjects.empty? %> 

aide s'il vous plaît ..

Répondre

4

Votre clause where ne demande pas quoi que ce soit à comparer avec, alors PG ne sait pas quoi inclure dans les résultats. Une clause where doit être vraie ou fausse.

Vous cherchez probablement quelque chose comme:

<% cities = SubjectGradeCity.includes(:city).collect(&:city).uniq %> 
<% grades = SubjectGradeCity.includes(:grade).where(:city_id => cities).collect {|s| {:name => s.grade.name, :id => s.grade.id}}.uniq %> 
<% subjects = SubjectGradeCity.includes(:subject).where(:city_id => cities).collect {|s| {:name => s.subject.name, :id => s.subject.id}}.uniq %> 

De cette façon, vous comparez votre clause where pour voir si son inclus dans les villes résultat de la première ligne ... mais je ne suis pas sûr cela fonctionnera non plus, puisque votre première ligne renvoie un ensemble d'objets SubjectGradeCity au lieu d'objets city. Mais vous pouvez peut-être comprendre à partir de là? Editer: Vous devriez également prendre le conseil de NickM sur le déplacement de ces types de méthodes hors de la vue. Ils devraient certainement être à la couche du modèle.

+1

wow, je sais une idée. et si je le dis de cette façon? <% grades = SubjectGradeCity.includes (: grade) .where (: city_id =>: city_id) .collect {| s | {: name => s.grade.name,: id => s.grade.id}}. uniq%> <% sujets = SubjectGradeCity.includes (: sujet) .where (: city_id =>: city_id) .collect {| s | {: name => s.subject.name,: id => s.subject.id}}. uniq%> – ben

+1

Cela fonctionne, mais d'où obtenez-vous le: city_id? Aussi, voir edit qui inclut la réponse de NickM qui est absolument une bonne pratique. –

+0

oui, je suis d'accord. merci beaucoup, ça a marché. J'utilisais un formulaire pour soumettre à un contrôleur, je ne veux pas utiliser un modèle. – ben

2

Vous ne devriez jamais mettre des requêtes de base de données dans vos vues ... jamais. Je les déplacerais au moins à un assistant, mais ils devraient idéalement être définis dans votre modèle. Cela dit, la réponse d'Helios est bonne aussi longtemps que vous la mettez dans votre modèle.

+0

Certainement! Bon cri. –

Questions connexes