Ruby on Rails: с именем Scope OR переводится в AND, когда становится SQL - PullRequest
0 голосов
/ 09 августа 2010
{ :conditions =>  ["#{"(visibility = #{Shared::PUBLIC}) || " if include_non_employee_public} (visibility IN (#{employee_privacy}) AND user_id IN (#{users}))"] }

есть мое условие для моей именованной области. Теперь я попробовал оба || и ИЛИ в именованной области, но консоль всегда показывает И.

есть идеи?

1 Ответ

1 голос
/ 09 августа 2010
{ :conditions =>  ["#{"(visibility = #{Shared::PUBLIC}) || " if include_non_employee_public} (visibility IN (#{employee_privacy}) AND user_id IN (#{users}))"] }

Это сбивает с толку попытки перепроектировать то, что вы пытаетесь сделать здесь.Обычно в SQL-запросе всегда следует использовать «ИЛИ», а не «||».||будет работать только в вашем коде ruby.Кроме того, обычно вы должны использовать?и затем поместите значение потом, вместо того, чтобы использовать оценку строки.Это будет работать лучше, например, с массивами, которые вы здесь используете.Например,

{ :conditions =>  ["#{"(visibility = ?) || " if include_non_employee_public} (visibility IN (?) AND user_id IN (?))"], Shared::PUBLIC, employee_privacy, users]  }

Хорошо, следующий шаг - понять, что вы пытаетесь сделать.Допустим, ради аргумента, что include_non_employee_public имеет значение true.Тогда вы получите

{ :conditions =>  ["(visibility = ?) || (visibility IN (?) AND user_id IN (?))"], Shared::PUBLIC, employee_privacy, users]  }

Давайте обменять это ||для или он будет работать в sql:

{ :conditions =>  ["(visibility = ?) or (visibility IN (?) AND user_id IN (?))"], Shared::PUBLIC, employee_privacy, users]  }

Это то, что вы пытаетесь сделать?Это теперь не будет работать, потому что в случае, когда include_non_employee_public имеет значение false, теперь у вас есть запасное значение (Shared :: Public) во второй части списка аргументов.Я бы для простоты разбил это на выражение if:

if include_non_employee_public
  conditions = ["(visibility = ?) or (visibility IN (?) AND user_id IN (?))"], Shared::PUBLIC, employee_privacy, users] 
else
  conditions = ["visibility IN (?) AND user_id IN (?)"], employee_privacy, users] 
end

Теперь вы можете сказать: условие => условия в вашем запросе.

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