26-09-2011, 05:52 PM
(Modification du message : 26-09-2011, 05:53 PM par Sephi-Chan.)
(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.
Quand tu crées une colonne booléenne, pense à bien mettre null à false et à specifier un default (à true 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 ender, class_name: "User"
belongs_to :receiver, class_name: "User"
def self.unread
where(read: false)
end
end
class User < ActiveRecord::Base
has_many ent_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 !