SQL для ActiveRecord - PullRequest
       1

SQL для ActiveRecord

0 голосов
/ 17 октября 2018

У меня проблемы с написанием запроса ActiveRecord.

У меня есть то, что мне нужно на SQL

SELECT "flags".* FROM "flags" INNER JOIN "flag_histories"
 ON "flag_histories"."flag_id" = "flags"."id" WHERE "flags"."external_organization_id" = 2 AND
  ((start_active <="2018-10-16"  AND  end_active >=  "2018-10-16")
  OR ( start_active <= "2018-10-16" AND end_active IS NULL)) GROUP BY "flags"."id")

И это то, что я тестировал на рельсах без успеха

  Flag.joins(:flag_histories)
  .where("end_active >= :date AND start_active <= :date",
            {date: date})
  .or("end_active is null AND start_active <= :date",
            {date: date})
  .where(flags: {external_organization_id: org_id})
  .group(:id)

К настоящему времени я получаю

неверное количество аргументов (учитывая 2, ожидается 1) Извлеченный источник (около строки # 28):

  .or("end_active is null AND start_active <= :date",

Может кто-нибудь датьмне руку с этим?

Спасибо.

1 Ответ

0 голосов
/ 17 октября 2018

Почему бы вам не написать свое состояние, используя один where вызов, такой как:

Flag.joins(:flag_histories)
    .where(
       "external_organization_id = :org_id AND
        (start_active <= :date AND end_active >= :date
         OR start_active <= :date AND end_active IS NULL)",
       { date: date, org_id: org_id }
    ).group('flags.id')

или:

Flag.joins(:flag_histories)
    .where(external_organization_id: org_id)
    .where(
       "start_active <= :date AND end_active >= :date
         OR start_active <= :date AND end_active IS NULL",
       { date: date }
    ).group('flags.id')

(я предполагаю, что каждый из * 1008Поля *, start_active и end_active присутствуют либо в таблицах flags, либо flag_histories, но не в обеих, иначе в условии, что к ним необходимо добавить правильное имя таблицы)

ОБНОВЛЕНИЕ :

Я никогда раньше не использовал метод or, но как документация говорит, что он имеет некоторые особенности и не может использоваться так же, как where,Вместо условия у него должен быть другой Relation в качестве аргумента:

# File activerecord/lib/active_record/relation/query_methods.rb, line 622
def or(other)
  unless other.is_a? Relation
    raise ArgumentError, "You have passed #{other.class.name} object to #or. Pass an ActiveRecord::Relation object instead."
  end

  spawn.or!(other)
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...