我想获取用户拥有或创建的所有活动,因此我使用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"}]}
CanCan默认创建or
选择器,因为该功能中有多个规则。
现在这样做很直观:
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:事后的想法:accessible_by
不应该总是返回{'$and' => {'$or' => [...]}}
而不是{'$或'=> [...]}?