我有两种模式:用户和通知。
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
答案 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。