Ruby on rails overwrite有许多关联以使用两个不同的所有者ID

Ruby on rails overwrite有许多关联以使用两个不同的所有者ID,ruby-on-rails,activerecord,Ruby On Rails,Activerecord,我有两个模型:用户和通知 User has_many :notifications Notification belongs_to User 这是描述通知的代码 +------------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +------------+--------------

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

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 |
+----+---------+-----------+-----------------+-------+
用户_id=-1的行是默认值,每次用户覆盖默认值时,我都会为该用户添加一行以及名称空间和操作以及被覆盖的值

现在,如果我这样做了,我会抱怨

User.notifications
我将只获取包含用户\u id的通知,但我还希望获取用户未覆盖的默认通知use\u id=-1。有什么办法吗? 此外,如果您对本设计/主题有更多建议,我们将不胜感激:

这也是对我的设计的更详细的解释

在用户类中尝试一个作用域,而不是直接使用has\u 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])

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

has_many :notifications, :conditions => 'user_id = #{id} OR user_id = -1'
注意:这不是插值字符串,它将在对象而不是类的上下文中进行插值

更新


甚至:finder_sql就足够了。总之,生活很有趣。

谢谢,我开始走这条路了,但我没用。我意识到scope是一个类方法,所以我不能对当前用户对象使用它。因此,当我使用该代码时,我得到了NoMethodError:undefined方法'id',因此字符串插值对我不起作用。我把它放在一个四分之一中,我还尝试了%q作为finder\u sql,但每次我做user.notifications时,我得到的通知都会加载0.3ms SELECT通知。*从通知中,notifications.user\u id=1和user\u id={id}或user\u id=-1有什么想法吗?我意识到rails 3需要使用lambdas,:conditions=>lambda{user\u id={self.id}或者用户_id=-1}谢谢您提供的详细信息。以前从未在Rails 3中见过它。