Рельсы, область, ИЛИ и соединения - PullRequest
3 голосов
/ 19 февраля 2011

У меня есть область действия:

includes(:countries).where("profiles.sector = :sector OR advices.sector = :sector", :sector => sector)

Он создает следующий SQL:

SELECT `profiles`.* FROM `profiles` INNER JOIN `advices` ON `advices`.`profile_id` = `profiles`.`id` WHERE (profiles.sector = 'Forestry_paper' OR advices.sector = 'Forestry_paper')

(да, у меня есть страна в моей Profile и в моей Country модели)

К сожалению, OR, похоже, не работает:

он не отображает профиль, имеющий только соответствующий сектор, но не имеет связанных с ним советов.Мысли?

Ответы [ 3 ]

10 голосов
/ 19 февраля 2011

Вы делаете ВНУТРЕННЕЕ СОЕДИНЕНИЕ, поэтому требуется, чтобы в профилях был соответствующий совет. Вместо этого попробуйте следующее:

Profile
  .joins("LEFT JOIN advices ON advices.profile_id = profiles.id")
  .where("profiles.sector = :sector OR advices.sector = :sector", :sector => sector)

Это также будет включать профили, которые не имеют советов.

8 голосов
/ 19 февраля 2011

Вы можете выполнять внешние объединения, указав предложение where с хешем после includes:

Post.includes(:comments).where(:comments=>{:user_id=>nil})

производит:

  Post Load (0.5ms)  SELECT "posts"."id" AS t0_r0, "posts"."created_at" AS t0_r1,
   "posts"."updated_at" AS t0_r2, "comments"."id" AS t1_r0, "comments"."user_id" 
   AS t1_r1, "comments"."post_id" AS t1_r2, "comments"."content" AS t1_r3,
   "comments"."created_at" AS t1_r4, "comments"."updated_at" AS t1_r5 
   FROM "posts" LEFT OUTER JOIN "comments" ON "comments"."post_id" = "posts"."id" 
   WHERE ("comments"."user_id" IS NULL)

Райан Бигг написал полезное сообщение в блоге об этом .

EDIT

Имейте в виду, что этот метод более или менее является побочным эффектом того, как Rails создает SQL для ассоциаций с активной загрузкой. Явное ЛЕВОЕ СОЕДИНЕНИЕ является более надежным, как предлагается в принятом ответе.

3 голосов
/ 27 мая 2011

Проверьте http://metautonomo.us/projects/metawhere/ для получения дополнительной информации ...

meta_where теперь не поддерживается: https://github.com/activerecord-hackery/meta_where

Rails 5 представляет операторы OR: Rails 5: ActiveRecord ИЛИ запрос

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