У меня есть приложение блога 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 равны нулю или соответствуют атрибутам пользователей.