1

ユーザーが所有または作成したすべてのアクティビティを取得したいので、次を使用して参加しorます。

Activity.or(owner_id: 123).or(creator_id: 123).selector
# => {"$or"=>[{"owner_id"=>123}, {"creator_id"=>123}]}

今、私はその上でCanCanを使用しようとしています。

Activity.accessible_by(current_ability)
# => {"$or"=>[{"privacy"=>"public"}, {"user_id"=>"51091cc977bb1eb27a000003"}]}

orアビリティには複数のルールがあるため、CanCan はデフォルトでセレクターを作成します。

これを行うのは今では直感的です。

Activity.or(owner_id: 123).or(creator_id: 123).accessible_by(current_ability)
# => {"$or"=>[{"owner_id"=>123}, {"creator_id"=>123}, {"privacy"=>"public"}, {"user_id"=>"51092b9777bb1ec385000003"}]}

orしかし、これは両方の配列を私が望むものではないものに結合するので、次のことを行いました:

Activity.or(criteria).and(Activity.accessible_by(current_ability).selector).desc(:created_at)
# => {"$or"=>[{"owner_id"=>123}, {"creator_id"=>123}], "$and"=>[{"$or"=>[{"privacy"=>"public"}, {"user_id"=>"51092b9777bb1ec385000003"}]}]}

しかし、これは少し汚れているようです。これを美化する方法について何か考えはありますか?ありがとうございました。

PS: 後付け: {'$or' => [...]} だけではなく、accessible_by常に a を返す必要はありませんか?{'$and' => {'$or' => [...]}}

4

0 に答える 0