CanCan和Mongoid“或”不好玩

时间:2013-01-30 13:19:10

标签: ruby-on-rails mongodb mongoid cancan

我想获取用户拥有或创建的所有活动,因此我使用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' => [...]}}而不是{'$或'=> [...]}?

0 个答案:

没有答案