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"}]}

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' => [...]}?

4

0 回答 0