覆盖has_many关联以使用两个不同的owner_ids

时间:2012-07-04 00:30:32

标签: ruby-on-rails activerecord

我有两种模式:用户和通知。

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)。任何想法如何做到这一点? 此外,对此设计/主题的任何建议都表示赞赏:)!

这也是对我设计的更详细解释 Database + data model design pattern

2 个答案:

答案 0 :(得分: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])

答案 1 :(得分:1)

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

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

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

<强>更新

甚至:finder_sql也足够好。无论如何,很多有趣的生活here