異なる(そしてある程度リンクされた)モデルにいくつかのスコープがあります
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)
そして、これはすべてあるべき姿です。
私が理解できないのは、これら2つのスコープを結合して、ユーザーが適切な権限を持っている任意のネットワークから発生するすべてのアラームのセットを生成する方法です。の線に沿った何か
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)
スコープをチェーンしようとしましたが(動作させることができません)、スコープをマージしようとしました(明らかに間違ったことです!)
任意のアイデア-私は数日間、これで髪を引き裂いてきました。
ありがとう、
スティーブ