我想获取用户拥有或创建的所有活动,因此我使用以下方式加入它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
总是返回 a{'$and' => {'$or' => [...]}}
而不是只返回 {'$or' => [...]}?