2016-08-26 4 views
0

Я использую mongoid-history драгоценный камень и мангуст в Рубине. Я фактически связываю историю монго с моделью под названием SocialPost, поэтому я могу что-то сделать.Создать модель с помощью атрибута hash

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, что-то вроде этого:

UPDATE с помощью $ 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}] }) 

ответ

0

я нашел уже в Возможное решение. ElemMatch должны быть построены сгруппирован с идентификаторами, которые необходимо собрать, так это то, что я сделал:

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}) 
Смежные вопросы