Mongoid 3 Сложный запрос с AND и OR

У меня есть приложение блога Rails 3.2, которое показывает сообщения пользователям в зависимости от их компании и региона. Я также хочу показывать сообщения, где пользователь является автором сообщения, даже если оно было создано для другой компании или региона (у объекта «Пост» есть регион и компания, а также у объекта «Пользователь»).

Я сделал что-то подобное в MySQL с запросом:

SELECT * FROM Post WHERE approved = true AND hold = false AND 
((company_id IN (null, 'user_company_id') AND region IN (null, 'user_region_id')) 
OR author = 'user_id') ORDER BY published_date;

Сейчас мы переносим приложение на MongoDB, используя гем Mongoid, и это последний запрос, который я не могу понять. Вот что я получил до сих пор, в котором используется комбинация Origin и Selector для вызовов документа:

@posts = Post.and(
    {approved: true},
    {hold_publish: false},
    {"$or" => [
        {"$and" => [{:company_id.in => [nil, @user.company.id]}, {:region_id.in => [nil, @user.region.id]}]},{user_id: @user.id}
    ]}).desc(:published_date)

Тем не менее, это будет извлекать только сообщения, где company_id и region_id равны нулю или соответствуют атрибутам пользователей.


person tagCincy    schedule 07.09.2012    source источник


Ответы (1)


Вот ваш запрос, попробуйте это -

Post.where(approved: true,hold_publish: true)
  .or(:company_id.in => [nil, @user.company.id],:region_id.in => [nil, @user.region.id])
  .or(user_id: @user.id)
  .desc(:published_date)
person abhas    schedule 08.09.2012