У меня есть модель развертывания, она имеет следующие отношения:
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. Все еще ищу предложения, если они есть.