私はこのようなifステートメントを受け取りました
if can?(:read, Category) || can?(:read, Category2)
ユーザーがCategoryまたはCategory2を読み取ることができる場合、リンクが表示されます。
しかし、10のカテゴリがある場合はどうなりますか?それらをリストする代わりに、より短い方法が必要です。少し助けが必要です。
私はこのようなifステートメントを受け取りました
if can?(:read, Category) || can?(:read, Category2)
ユーザーがCategoryまたはCategory2を読み取ることができる場合、リンクが表示されます。
しかし、10のカテゴリがある場合はどうなりますか?それらをリストする代わりに、より短い方法が必要です。少し助けが必要です。
これを行うためのより速い方法(すでにカテゴリのリストがある場合)detect
は、ORであり、条件の1つだけが真である必要があるため使用することだと思います
categories.detect { |cat| can? :read, cat }
オブジェクトのリストがあると仮定します。
categories = [Category1, Category2, Category3]
inject
次のように、を使用して結果を取得できます。
categories.inject(false) { |p, cat| p || can?(:read, cat) }
これが文字通り評価されるのは次のとおりです。
(((false || can(:read, Category1)) || can(:read, Category2)) || can(:read, Category3))
もちろん、これは次と同等です。
can?(:read, Category1) || can?(:read, Category2) || can?(:read, Category3)
jvnillの方法は問題ありませんが、ブール値を返すだけなので、これはより速く、より明確になるはずです。
[Category, Category2, ...].any?{|cat| can?(:read, cat)}