JeuWeb - Crée ton jeu par navigateur
[Résolu][Rails] Count avec condition - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : [Résolu][Rails] Count avec condition (/showthread.php?tid=5710)



[Résolu][Rails] Count avec condition - popayan - 26-09-2011

Bonjour!

Une petite question en passant:

J'ai un modèle Message avec un champ "readed" avec comme valeur 0 ou 1.
Dans la console, je fais un Message.count(:conditions => [ "receiver_id = ? AND readed = ?", 1, 0 ]), il me retourne 0 alors que normalement il devrait me retourner 3. Si je fais l'inverse Message.count(:conditions => [ "receiver_id = ? AND readed = ?", 1, 1 ]), il me retourne bien 2...

Où est ce que je pourrais avoir un problème? (Je sens gros comme une maison que ca va être un truc tout con...)


RE: [Rails] Count avec condition - Sephi-Chan - 26-09-2011

Oula, c'est bizarre comme approche ça. En général on utilise plutôt les associations et les scope !
Je vais chez le toubib mais à mon retour je te fais une belle réponse. Smile

Dans l'esprit, tu devrais plutôt avoir user.received_messages.unread.count.


RE: [Rails] Count avec condition - Sephi-Chan - 26-09-2011

(26-09-2011, 03:05 PM)popayan a écrit : Bonjour!

Une petite question en passant:

J'ai un modèle Message avec un champ "readed" avec comme valeur 0 ou 1.
Dans la console, je fais un Message.count(:conditions => [ "receiver_id = ? AND readed = ?", 1, 0 ]), il me retourne 0 alors que normalement il devrait me retourner 3. Si je fais l'inverse Message.count(:conditions => [ "receiver_id = ? AND readed = ?", 1, 1 ]), il me retourne bien 2...

Où est ce que je pourrais avoir un problème? (Je sens gros comme une maison que ca va être un truc tout con...)

Tu parles d'une colonne readed à 0 ou 1. Tu devrais plutôt utiliser le type booléen proposé dans les migrations. C'est fait pour et ça donne quelques méthodes pratiques. De plus, ça permet de tester directement la valeur de l'attribut, car même si ça contient 0, c'est évalué comme true par Ruby au sein d'une condition !

J'en profite pour ajouter que read étant irrégulier, readed n'existe pas. Wink

Quand tu crées une colonne booléenne, pense à bien mettre null à false et à specifier un defaulttrue ou false selon ton besoin, ici je mettrais false) dans la migration. Exemple :


class AddReadToMessages < ActiveRecord::Migration
def change
add_column :messages, :read, :boolean, null: false, default: false
end
end

Le code que je vais te proposer te permettra d'écrire des choses comme :


foo = User.find_by_name("Foo")
bar = User.find_by_name("Bar")

foo.sent_messages.create(receiver: bar, content: "Pomme de terre !")

bar.received_messages.count # => 1
bar.received_messages.unread.count # => 1
foo.sent_messages.unread.count # => 0

first_unread_message = bar.received_messages.unread.order(:created_at).first
first_unread_message.toggle! :read

bar.received_messages.unread.count # => 0
foo.sent_messages.unread.count # => 1

puts "\o/"

Voilà les modèles Message et User :


class Message < ActiveRecord::Base
belongs_to Confusedender, class_name: "User"
belongs_to :receiver, class_name: "User"

def self.unread
where(read: false)
end
end


class User < ActiveRecord::Base
has_many Confusedent_messages, class_name: "Message", foreign_key: "sender_id"
has_many :received_messages, class_name: "Message", foreign_key: "receiver_id"
end

J'espère que ça t'aidera ! Smile


RE: [Rails] Count avec condition - popayan - 26-09-2011

le type boolean a l'air bien sympa en effet, je regarde ca demain, merci beaucoup :p