1

cancan アビリティ クラスでアビリティを定義すると...

これは:

 can :manage, Area, :location => { :company => { :manager => { :user_id => user.id } } }

これと同じ:

 can :manage, Area do |area|
      area.location.company.manager.user_id == user.id
 end

ブロックを使用せずに能力を定義することをよりよく理解しようとしています。ある方法は他の方法よりも優れていますか (おそらく速いですか)?

4

2 に答える 2

3

この 2 つは同じはずですが、他の誰かがあなたのコードを読んでいる場合は、2 番目の方法の方がはるかに明確です。私は間違いなく2番目の方法を使用することをお勧めします. 複数の行が必要な場合は、次のように記述できます。

can( :manage, Area ) {|area| area.location.company.manager.user_id == user.id }

これは、他のオプションよりもおそらくクリーンです (他のルールの束と積み重ねた場合)。

于 2012-08-29T02:45:38.820 に答える
2

ここで言うように:

https://github.com/ryanb/cancan/wiki/Defining-Abilities-with-Blocks#fetching-records

ブロックを使用する大きな利点は、accessible_by が機能することです。ブロックを使用し、accessible_by も使用する場合は、SQL の where 句を手動で追加する必要があります。これは完全に DRY ではなく、可能であれば回避する必要があります IMO.

于 2013-08-20T01:49:07.487 に答える