[英]Rails - combining scopes from different tables
我在不同(且有些联系)的型号上有几个作用域
class Alarm
has_one :site #use mac_address field in Alarm and Site as key / foreign key
scope :any_network, lambda{ joins(:network) } #more complex stuff can be done :-)
#etc
end
class Network
has many :permissions
has_many :sites
scope :has_permission, lambda{|level, user| #etc - returns a list of networks that a
# user has the `level` permission for }
#etc
end
class Permission
has_one :network, :user
#etc -uses a flags field to hold permision levels
end
所以我可以做
Alarm.any_network
产生
SELECT `alarm`.* FROM `alarm` INNER JOIN `site` ON
`site`.`mac_address` = `alarm`.`mac_address` INNER JOIN `network` ON
`network`.`id` = `site`.`network_id`
我可以做
Network.has_permission('manager',1)
产生
SELECT `network`.* FROM `network` INNER JOIN `permission` ON
`permission`.`network_id` = `network`.`id`
WHERE (permission.user_id = 1 and permission.flags && 8)
这就是应有的一切。
我无法解决的是如何将这两个作用域结合在一起以生成源自用户具有适当权限的任何网络的所有警报的集合。 遵循以下原则
SELECT `alarm`.* FROM `alarm` INNER JOIN `site`
ON `site`.`mac_address` = `alarm`.`mac_address`
INNER JOIN `network` ON `network`.`id` = `site`.`network_id`
INNER JOIN `permission` ON `permission`.`network_id` = `network`.`id`
WHERE (permission.user_id = 1 and permission.flags && 8)
我尝试链接范围(无法正常工作),并且尝试合并范围(显然做错了!)
任何想法-我已经在这上面扯了几天头发。
谢谢,
史蒂夫
乍一看,我想像这样的事情,但是很难说出来,因为您没有给我们提供Site
模型:
Alarm.includes(:site => {:network => :permissions}).where(['permissions.flags' && ?', 8], 'permissions.user_id' => 1)
这显然是未经测试的,很难确切地说出来,但这是发生的事情的要点:
仅供参考,我不记得,如果这种多重条件where
上面使用就像我的工作,但也许它会得到你的车轮转动!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.