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中见过它。