ユーザーが所有または作成したすべてのアクティビティを取得したいので、次を使用して参加し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' => [...]}}