0

我有两个模型:用户和通知。

User has_many :notifications
Notification belongs_to User

这是通知的描述代码

+------------+--------------+------+-----+---------+----------------+
| 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    |                |
+------------+--------------+------+-----+---------+----------------+

这些是一些通知示例:

+----+---------+-----------+-----------------+-------+
| 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 |
+----+---------+-----------+-----------------+-------+

user_id = -1 的行是默认值,每次用户覆盖默认值时,我都会为该用户添加一行以及命名空间和操作以及覆盖的值。

现在,如果我这样做,我会发怒

User.notifications

我只会获得其中包含 user_id 的通知,但我还想获得用户尚未覆盖的默认通知 (use_id = -1)。任何想法如何做到这一点?还感谢有关此设计/主题的更多建议:)!

这也是我设计 数据库+数据模型设计模式的更详细的解释

4

2 回答 2

1

我认为您可以尝试:conditions为您的关联使用选项:

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

注意:这不是插值字符串,它将在对象而不是类的上下文中进行插值。

更新。

或者甚至:finder_sql会足够好。不管怎样,这里有很多有趣的生活。

于 2012-07-04T15:30:30.370 回答
1

在您的 User 类中尝试使用范围,而不是直接使用 has_many 关系。像这样的东西:

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])
于 2012-07-04T03:59:46.550 回答