0

CanCanを使用してユーザーにアクセスを許可するRails 4アプリに取り組んでおり、canブロックに取り組んでいますが、うまく書かれていないようです。疑似コードだと思います。仕事。より良い、またはより効率的に機能するように変更できますか? また、リクエストの処理に時間がかかる可能性のある不必要な問い合わせを回避しようとしています。

can :manage, User do |u|
  u.id.eql?(user.id) || u.account.founders.includes(u) || u.account.collaborators.includes(u)
end
4

1 に答える 1

2

ここには、すでに正しいコードがほとんどあります。これが私がそれを行う方法です:

can :manage, User do |u|
  u.id == user.id ||
  u.account.founders.exists?(u.id) ||
  u.account.collaborators.exists?(u.id)
end

比較==は Ruby の標準です。eql?めったに使用されません。

このexists?メソッドは、軽量のデータベース クエリを実行しtrue、データベースのレコード内にその ID が含まれているかどうかを返します。includes関連付けを熱心にロードするための ActiveRecord メソッドであるため、以前のやり方は間違っていました。同様の名前のinclude?メソッドを使用したとしても、アカウントのすべての創設者と共同作業者が読み込まれ、Ruby を使用してそれらのコレクションにそのユーザーが含まれているかどうかが確認されます。

于 2013-08-27T23:53:55.780 に答える