2010-06-05 4 views
0
  • J'ai une table de notifications qui contient différents types de notifications pour différents événements.
  • A l'intérieur de la table est une colonne notifications_type:string qui contient le type de notification, à savoir « foo » ou « bar » ou « ouf »
  • Je veux que l'utilisateur soit en mesure de sélectionner les notifications qu'ils veulent afficher, donc il sont des cases à cocher en dessous du résultat qui correspondent à prefs_display_foo:boolean, prefs_display_bar:boolean dans le modèle User.
  • Quelle est une façon élégante pour moi de définir le :conditions dans la recherche pour afficher correctement les résultats triés? De plus, actuellement, je l'ai comme méthode dans le modèle de l'utilisateur, mais comment pourrais-je le faire en tant que has_many :notifications, :conditions => .....

Répondre

1

Vous pouvez essayer cette

quitter le has_many sans aucune condition, puis créer un named_scope pour gérer les préférences, ce code n'a pas été testé

class User 
    has_many :notifications 

    def notification_preferences 
     list = [] 
     list << 'Foo' if prefs_display_foo 
     list << 'Bar' if prefs_display_bar  
     # etc... 
     return list 
    end 
end 

class Notification 
    belongs_to :user 

    named_scope :preferred, 
     lambda { |preferences| { 
      :conditions => ["notifications_type IN (?)", preferences] 
      } 
     } 
end 

# ... 
user = User.find(1) 
notifications = user.notifications.preferred(user.notification_preferences) 
+0

Impressionnant. Je suis un peu nouveau sur les portées nommées, mais je peux les combiner correctement? Signification, j'ai encore un prefs_display_results: nombre entier pour combien de résultats ils veulent, donc si j'ajoute une autre portée appelée "limite" puis-je utiliser quelque chose comme notifications = user.notifications.preferred(user.notification_preferences).limit(user.prefs_display_results) Kevin

+0

ouais, vous pouvez chaîner named_scopes (limite peut être réservé mot, pas sûr) – house9

+0

Nevermind ... en regardant cela, je vais juste étendre la requête lambda et le tableau – Kevin

Questions connexes