Область применения Rails с несколькими необязательными ассоциациями - PullRequest
0 голосов
/ 16 марта 2020

У меня есть модель развертывания, она имеет следующие отношения:

  belongs_to :user
  belongs_to :user_group, optional: true

Я хочу иметь возможность определить область для более легкой фильтрации. Я легко могу отфильтровать по пользователю, что-то вроде этого:

scope :by_owner, -> (ow) {  joins(:user).where("users.name like ?", "%#{ow}%") }

Но что я действительно хочу сначала использовать user_group, если ассоциация существует, а если нет, то обратиться к пользователю. Logi c будет работать так:

If this deployment belongs to at least one user_group
  scope :by_owner, -> (ow) {  joins(:user_group).where("user_groups.name like ?", "%#{ow}%") }
else
  scope :by_owner, -> (ow) {  joins(:user).where("users.name like ?", "%#{ow}%") }
end

Я предполагаю, что мне нужно каким-то образом добиться этого с помощью запроса SQL, но я не могу понять это. Какие-либо предложения? Спасибо!

Обновление. Я немного приблизился к следующему запросу:

  scope :by_owner, -> (ow) {  joins(:user, :user_group).where("(users.display_name like ?) OR (user_groups.name like ?)", "%#{ow}%", "%#{ow}%") }

Но это все еще не так, потому что 1-я из всех записей, которые не имеют ассоциации user_groups, игнорируются в ответ, а также он ищет пользователя, даже если определена user_group. Все еще ищу предложения, если они есть.

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