使用哈希属性创建模型范围

时间:2016-08-26 14:40:20

标签: ruby model mongoid

我在Ruby中使用mongoid-history gem和mongoid。我实际上将mongo历史链接到一个名为SocialPost的模型,所以我可以做类似的事情。

history = current_user.social_posts.history_tracks

现在我需要过滤这个历史记录'使用范围或方法过滤属性' association_chain'从历史跟踪模型,但' history_tracks'属性是这样做的:

<HistoryTracker _id: 57bdc1cb65e59325ae000001, created_at: 2016-08-24 15:48:27 UTC, updated_at: 2016-08-24 15:48:27 UTC, association_chain: [{"name"=>"SocialPost", "id"=>BSON::ObjectId('57ac8b0f65e5930944000000')}], modified: {"facebook_likes_count"=>2594213, "tweeter_followers_count"=>0}, original: {}, version: 1, action: "update", scope: "social_post", modifier_id: nil>

那么,我如何在我的HistoryTracker模型中创建一个搜索,允许我在association_chain中搜索特定的一组id,如下所示:

HistoryTracker.where(:association_chain.in => {"name"=>"SocialPost", "id"=>[GROUPS OF IDS TO SEARCH]}

使用$ elemMatch更新

#test case multiple social_id: empty result
HistoryTracker.any_in({:association_chain.elem_match => [{name: 'SocialPost', :id.in => social_ids}] })

#test case 1 social_id: match result
HistoryTracker.any_in({:association_chain.elem_match => [{name: 'SocialPost', :id => social_ids.first}] })

1 个答案:

答案 0 :(得分:0)

我发现已经有了一个可行的解决方案。 elemMatch应该与你需要收集的ID组合在一起,所以这就是我所做的:

social_ids = [BSON::ObjectId('...1'), BSON::ObjectId('...2'), BSON::ObjectId('...3')]

#reorder the ids with the extra hash elements
a = []
social_ids.each do |id_bson|
  a << {name: 'SocialPost', id: id_bson}
end

现在您创建了'QUERY'

HistoryTracker.any_in({:association_chain.elem_match => a})