7
votes

ActiveRecord :: relevéinvalid sqlite3 :: sqlexception: pas de telle colonne: true:

Je veux avoir @Messages retour @ dossier.messages où la valeur de la colonne "supprimée" n'est pas égale à true. Je ne suis pas sûr de savoir pourquoi cela continue de jeter une sqlexception. Je suppose que je ne sais pas correctement l'attribut supprimé, mais je ne sais pas comment le réparer.

Toute aide serait grandement appréciée. Merci d'avance. P>

Message d'erreur: p>

1   class MailboxController < ApplicationController  
2     def index  
3       current_user = User.find(session[:user_id])  
4       @folder = Folder.where("user_id = #{current_user.id}").first  
5       show  
6       render :action => "show"  
7     end
8  
9     def show  
10      current_user = User.find(session[:user_id])  
11      @folder = Folder.where("user_id = #{current_user.id}").first  
12      @msgs = @folder.messages  
13      @ms = @msgs.where("deleted != true")  
14      @messages = @ms.all.paginate :per_page => 10,  
15                 :page => params[:page], :include => :message,  
16                 :order => "messages.created_at DESC"  
17    end  
18  end  


0 commentaires

3 Réponses :


3
votes
@ms = @msgs.where("deleted = ? OR deleted = ?", false, nil)
# wich won't work, Thanks to @mu is too short
@ms = @msgs.where("deleted = ? OR deleted IS NULL", false)

0 commentaires

0
votes

Essayez

@ms = @msgs.where(["deleted != ?",true])


2 commentaires

Eh bien, ça ne jette plus l'erreur, c'est bien. Mais cela ne retourne toujours pas les résultats que je veux. Une autre question, comme la déclaration est écrite ... Je suppose que cela devrait également renvoyer des valeurs sur lesquelles "supprimé" n'est pas défini (c'est-à-dire une valeur vraie ou fausse), je suppose correctement?


Celui-ci ne vous fera que celles qui sont vraies. Si vous voulez en retourner ceux qui sont NULL, faites quelque chose comme: @ms = @ msgs.where (["supprimé est null ou supprimé! =?", True])



19
votes

SQLITE utilise C-style Valeurs booléennes :

SQLite n'a pas de classe de stockage booléenne séparée. Au lieu de cela, les valeurs booléennes sont stockées sous forme d'entiers 0 (faux) et 1 (vrai).

Alors, quand vous dites ceci: xxx

sqlite ne sait pas ce que vrai est donc donc il suppose que vous êtes Essayer de faire référence à un autre nom de colonne.

La bonne façon de faire face à cela est de laisser convertir votre rubis booléen en un booléen SQLite Boolean (comme dans les réponses de Tam's et Fl00r). Je pense qu'il est utile de savoir ce que vous faites mal ce que vous faites mal.

update : si vous souhaitez vérifier pour non-true supprimé et inclure Null puis tu veux ceci: xxx

ou meilleur, ne permettez pas aux nulls dans supprimé du tout. Vous ne devriez pas permettre à NULL est une colonne que si vous ne devez absolument que (Par défaut de la nullabilité de ActiveCord, est exactement le contraire de ce que cela devrait être). Le SQL NULL est une bête étrange et vous devez toujours le traiter spécialement, mieux de ne pas le permettre que si vous avez besoin d'une valeur «non spécifiée» ou «non spécifiée» pour une colonne.


13 commentaires

Je pensais que cela stocke t / f paire. Mais je peux me tromper :). Mais maintenant, je regarde dans votre lien - j'avais tort :) mais quelqu'un stocke t / f . Définitivement!


Merci pour l'explication. C'était très utile. Juste pour m'assurer que je comprends bien SQL correctement ... Comment gère-t-il une valeur nul? En disant! = 1 (vrai), retournera-t-il également des lignes avec des valeurs nulles? Merci encore.


Il suffit de passer ce travail aux rails: @ msgs.aught ("supprimé! =?", nil) . C'est comme SQL NULL condition


J'essaie de retourner des lignes là où supprimé = false et supprimée = nil. J'ai essayé @ msg.herwhere (["supprimé =?", Nil] || ["supprimé =?", Faux]) Mais ce n'est toujours pas de retourner les lignes où la suppression est supprimée.


@ FL00R: PostgreSQL utilise 't' et 'f' et permet également de quelques autres choses aussi.


@ user714001: Si vous souhaitez attraper des valeurs NULL, vous devez ajouter un Explicit Supprimé est NULL à la clause WHERE, supprimé = null ne doit pas fonctionner dans aucun La base de données comme x = null est false pour tout x (même si x est lui-même null). J'ai ajouté une mise à jour rapide sur NULL.


@ FL00R: Je ne pense pas @ msgs.aught ("supprimé! =?", nil) fonctionnera, ne ferait pas tourner cela dans supprimé! = null ? Toute comparaison à NULL doit être effectuée avec x est null ou x n'est pas null en raison des caractéristiques uniques de NULL.


@mu est trop court: génial! Merci beaucoup. Je ne suis évidemment pas bien versé dans les requêtes SQL et DB. Merci merci merci! @ FL00R: Merci aussi. Vous êtes tous les deux génial!


@Mu est trop court, cela fonctionnera. Parce que AR va le gérer de la même manière que celle-ci gère ("supprimé =?", False) . Il convertira supprimé = null sur supprimé est null et supprimé non null ou supprimé n'est pas null pour 'non Null 'avec différentes bases de données


@ FL00R: Êtes-vous sûr que cela réécrirea l'extrait SQL? Je viens de faire une trace rapide via le code AR3 et je vois des choses comme énoncé.gsub ('?') mais rien qui changerait = sur est comme cas particulier. Je pense que l'envoi dans {: supprimé => nil} fonctionnerait cependant.


Hm. Tu as complètement raison. : Supprimé => nil est ce que je jouais avec. Merci!


@ FL00R: Aucun orme ne peut vous isoler de SQL. Si vous allez utiliser une base de données relationnelle, vous devez DO Comprendre SQL. SQL n'est certainement pas la meilleure solution possible au problème de la base de données, mais c'est la solution que nous devons faire face. Et, l'incorporation d'une langue à l'intérieur d'une autre est toujours un peu de désordre, Regex s'échappant à l'intérieur d'une chaîne qui va dans une base de données serait un bon exemple de non-sens imbriqué.


@mu, je sais SQL (bien sûr pas brillant, mais cela correspond à mes besoins). Mais je ne comprends pas quelle est votre réponse :)