0

異なる(そしてある程度リンクされた)モデルにいくつかのスコープがあります

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)

スコープをチェーンしようとしましたが(動作させることができません)、スコープをマージしようとしました(明らかに間違ったことです!)

任意のアイデア-私は数日間、これで髪を引き裂いてきました。

ありがとう、

スティーブ

4

1 に答える 1

1

Site一見すると、このようなものを想像しますが、モデルを提供していないため、わかりにくいです。

Alarm.includes(:site => {:network => :permissions}).where(['permissions.flags' && ?', 8], 'permissions.user_id' => 1)

これは明らかにテストされておらず、正確に言うのは難しいですが、ここで何が起こっているのかの要点があります:

  1. サイト、ネットワーク、およびアクセス許可を熱心にロードする
  2. 理論上のSQLステートメントで概説する条件を適用します。

参考までに、この種の複数の条件が上記のように機能するかどうかは思い出せませんwhereが、おそらくそれはあなたの車輪を回転させるでしょう!

于 2012-08-16T19:37:14.557 に答える