私はcancanでいくつかの認証を実装しようとしています。ユーザーは自分のユーザーアカウント、スタッフのユーザーアカウント、およびメンバーのユーザーアカウントを管理できます。このような何か:cancanを使用したリソースの複数の機能
# own account
can :manage, User, :ID => user.ID
# staff
can :manage, User, :provider_staff => {:ProviderID => user.ID}
#members
can :manage, User, :consumer => { :ProviderID => user.ID }
は、残念ながら、私は動作しません。これを見つけたとき、認可コントローラのアクション、カンカンはINNERが効果的に戻ってから任意のクエリ結果を防ぎprovider_staffと消費者、上でJOINを実行するので:
SELECT TOP (10) [__rnt].ID FROM (SELECT ROW_NUMBER() OVER (ORDER BY [User].UserDisplayAs ASC) AS [__rn], [User].ID FROM [User] INNER JOIN [Consumer] ON [Consumer].[ID] = [User].[ID] INNER JOIN [ProviderStaff] ON [ProviderStaff].[ID] = [User].[ID] LEFT OUTER JOIN [UserView] ON [UserView].[ID] = [User].[ID] LEFT OUTER JOIN [Address] ON [Address].[UserID] = [User].[ID] LEFT OUTER JOIN [Phone] ON [Phone].[ID] = [User].[PhoneID] WHERE [User].[DeletedFlag] = 0 AND (([Consumer].[ProviderID] = 32) OR (([ProviderStaff].[ProviderID] = 32) OR ([User].[ID] = 32))) AND (UserView.IsConsumer = 1) GROUP BY [User].ID, [User].UserDisplayAs) AS [__rnt] WHERE [__rnt].[__rn] > (0) ORDER BY [__rnt].[__rn] ASC
申し訳ありませんが、奇妙なデータベーススキーマのためのいくつかのファンクを持つ醜いMSSQLクエリです。あなたが何も得ていない消費者テーブルとスタッフテーブルの両方をINNER JOINにしようとすると、
ブロックでは、おそらくusers#showの個々の読み込みを処理できます。しかし、私はこのSQLクエリをどのように変更して、load_resourceをすべてスキップし、ユーザ#インデックスコードで独自のクエリを実装するのが不十分であるかを知ることができます。
提案がありますか?