Je suis nouveau sur les rails. Je m'éclate. L'API de requête me pose cependant quelques quelques problèmes. J'ai zoomé et fait beaucoup de choses très rapidement, mais c'est la première fois que je passe des heures à essayer de la comprendre. Ce n'est pas comme tout ce que j'ai utilisé auparavant - SQL normal, ou Hibernate, ou autre.
Le modèle que j'ai est assez simple.
- Un PrivateMessage a plusieurs destinataires
- Un destinataire a un destinataire (qui est de classe Utilisateur)
- le destinataire a également des champs pour "is_read" et "is_deleted".
Mon objectif est de construire une requête qui trouve tous les fichiers non lus et non supprimés. pour un utilisateur donné. Pour ce faire, nous devons joindre 'private_messages' à 'recipients'... et ensuite 'recipients' à à 'users'.
Voici le code du modèle d'utilisateur correspondant :
has_many :sent_messages, :class_name => 'PrivateMessage', :foreign_key => 'sender_id'
has_many :recipient_of_messages, :class_name => 'Recipient', :foreign_key => 'receiver_id'
scope :by_id, lambda { |id| where(:id => id) }
Mon modèle de destinataire a le code pertinent suivant :
belongs_to :receiver, :class_name => 'User', :foreign_key => "receiver_id"
belongs_to :private_message
scope :unread, where(:is_read => false).where(:is_deleted => false)
scope :by_receiver_id, lambda { |id| Recipient.joins(:receiver).merge(User.by_id(id)) }
scope :unread_by_receiver_id, lambda { |id| unread.by_receiver_id(id) }
Lorsqu'elle est testée de manière isolée, elle fonctionne à 100%.
Cependant, lorsque je code les requêtes par message privé, je rencontre des problèmes.
belongs_to :sender, :class_name => 'User'
has_many :recipients, :class_name => 'Recipient'
scope :sorted, order("private_messages.created_at desc")
scope :non_deleted, where(:is_deleted_by_sender => false)
scope :non_deleted_by_sender_id, lambda { |id| sorted.non_deleted.joins(:sender).merge(User.by_id(id)) }
# this scope does not work
scope :non_deleted_by_receiver_id, lambda { |id| sorted.joins(:recipients).merge(Recipient.by_receiver_id(id)) }
scope :newest, sorted.limit(3)
# this scope does not work either
scope :newest_unread_by_receiver_id, lambda { |id| newest.joins(:recipients).merge(Recipient.unread_by_receiver_id(id)) }
Lorsque j'essaie d'utiliser "newest_unread_by_receiver_id" ou "non_deleted_by_receiver_id", j'obtiens l'exception suivante :
ActiveRecord::ConfigurationError: Association named 'receiver' was not found; perhaps you misspelled it?
Cela n'a pas beaucoup de sens pour moi... parce que si le nom était mal orthographié mal, pourquoi n'échoue-t-il pas lorsque je teste l'isolation ?
Quelqu'un peut-il m'aider ? Celui-ci me rend fou. Dans des moments comme ça, j'ai juste envie de programmer en sql complet ou en Hibernate QL pour pouvoir en finir avec ça :(
Si j'aborde le problème de manière totalement erronée, j'apprécierais que vous me le fassiez savoir également. J'avais l'impression que l'utilisation des scopes et d'ActiveRelation était la voie à suivre dans Rails 3.1.
Merci