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
3 Réponses :
@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)
Essayez
@ms = @msgs.where(["deleted != ?",true])
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])
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). P> blockQuote>
Alors, quand vous dites ceci: p>
xxx pré> sqlite ne sait pas ce que
vrai code> est donc donc il suppose que vous êtes Essayer de faire référence à un autre nom de colonne. P>
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. P>
update strong>: si vous souhaitez vérifier pour non-true
supprimé code> et inclure Null puis tu veux ceci: p>
xxx pré> ou meilleur, ne permettez pas aux nulls dans
supprimé code> 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. P> P>
Je pensais que cela stocke t / f code> paire. Mais je peux me tromper :). Mais maintenant, je regarde dans votre lien - j'avais tort :) mais quelqu'un stocke
t / f code>. 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) code>. C'est comme SQL
NULL code> 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' code> et
et permet également de quelques autres choses aussi. 'f' code>
@ user714001: Si vous souhaitez attraper des valeurs NULL, vous devez ajouter un Explicit Supprimé est NULL code> à la clause WHERE,
supprimé = null code> ne doit pas fonctionner dans aucun La base de données comme
x = null code> est false pour tout b>
x code> (même si
x code> est lui-même null). J'ai ajouté une mise à jour rapide sur NULL.
@ FL00R: Je ne pense pas @ msgs.aught ("supprimé! =?", nil) code> fonctionnera, ne ferait pas tourner cela dans
supprimé! = null code> ? Toute comparaison à NULL doit être effectuée avec
x est null code> ou
x n'est pas null code> 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) code>. Il convertira
supprimé = null code> sur
supprimé est null code> et
supprimé non null code> ou
supprimé n'est pas null code> 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 ('?') Code> mais rien qui changerait
= code> sur
est code> comme cas particulier. Je pense que l'envoi dans
{: supprimé => nil} code> fonctionnerait cependant.
Hm. Tu as complètement raison. : Supprimé => nil code> 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 B> 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 :)