2012-07-04 2 views
0

J'ai deux modèles: Utilisateur et Notification.overwrite has_many association pour utiliser deux owner_ids différents

User has_many :notifications 
Notification belongs_to User 

Ceci est la description du code pour les notifications

+------------+--------------+------+-----+---------+----------------+ 
| Field  | Type   | Null | Key | Default | Extra   | 
+------------+--------------+------+-----+---------+----------------+ 
| id   | int(11)  | NO | PRI | NULL | auto_increment | 
| user_id | int(11)  | YES |  | NULL |    | 
| namespace | varchar(255) | YES |  | NULL |    | 
| key  | varchar(255) | YES |  | NULL |    | 
| value  | tinyint(1) | YES |  | NULL |    | 
+------------+--------------+------+-----+---------+----------------+ 

et ce sont quelques exemples de notifications:

+----+---------+-----------+-----------------+-------+ 
| id | user_id | namespace | key    | value | 
+----+---------+-----------+-----------------+-------+ 
| 4 |  -1 | facebook | launch_campaign |  1 | 
| 5 |  -1 | facebook | add_video  |  1 | 
| 6 |  -1 | facebook | add_image  |  1 | 
| 7 |  -1 | twitter | add_image  |  1 | 
| 8 |  -1 | twitter | add_video  |  1 | 
| 9 |  -1 | twitter | launch_campaign |  1 | 
| 10|  21 | facebook | add_video  |  0 | 
| 11|  1 | facebook | add_image  |  0 | 
| 12|  10 | twitter | add_image  |  0 | 
| 13|  12 | twitter | add_video  |  0 | 
+----+---------+-----------+-----------------+-------+ 

les lignes avec la user_id = -1 sont les valeurs par défaut, et chaque fois que l'utilisateur écrase la valeur par défaut, j'ajoute une ligne pour cet utilisateur et l'espace de noms et l'action ainsi que les valeurs écrasées.

Maintenant, je rails si je

User.notifications 

Je voudrais seulement obtenir les notifications qui ont le user_id en eux, mais je veux aussi les notifications par défaut (use_id = -1) que l'utilisateur n'a pas écrasé. Des idées comment faire cela? D'autres conseils sur ce design/sujet sont appréciés :)!

c'est aussi une explication plus détaillée de ma conception Database + data model design pattern

Répondre

1

Je pense que vous pouvez essayer d'utiliser :conditions options pour votre association:

has_many :notifications, :conditions => 'user_id = #{id} OR user_id = -1' 

NOTE: c'est pas chaîne interpolation, il sera interpolée dans le cadre d'un objet, pas la classe.

Mise à jour.

Ou même :finder_sql sera assez bon. Quoi qu'il en soit, beaucoup de vies intéressantes here.

+0

merci beaucoup! Je ne savais pas à propos de ces – Matilda

+0

Vous êtes les bienvenus. – ABrukish

+0

Donc l'interpolation de chaîne n'a pas fonctionné pour moi. Je l'ai mis en quate unique et j'ai aussi essayé% q pour finder_sql mais chaque fois que je fais user.notifications je reçois Notifications Load (0.3ms) SELECT 'notifications'. * FROM' notifications' WHERE 'notifications'.'user_id' = 1 AND (id_utilisateur = # {id} OU id_utilisateur = -1) des idées? – Matilda

1

Essayez un champ dans votre classe d'utilisateur au lieu d'utiliser la relation has_many directement. Quelque chose comme ceci:

scope :all_notifications, joins("left join notifications n on n.user_id=users.id").where(["n.user_id=? OR n.user_id=?", self.id, -1]) 
+0

Merci J'ai commencé à descendre cette route – Matilda

+0

Je n'ai pas travaillé. J'ai réalisé que scope est une méthode de classe, donc je ne peux pas l'utiliser pour l'objet User courant. Donc, quand j'utilise ce code, j'obtiens NoMethodError: méthode non définie 'id 'pour # Matilda

Questions connexes