Вам не хватает того, что соединение заставляет ассоциацию существовать.Чтобы предотвратить это, вы используете left_joins
:
User.left_joins(:event).where(event: {foo: bar})
Тем не менее это не решит проблему, потому что метод .or
будет работать (по документации) только для структурно эквивалентных отношений.
Вы можете фактически преодолеть это, перейдя на шаг ниже к Arel:
rels = [User.foo, User.bar(baz), User.joins(:event).temp]
cond = rels.map { |rel| rel.where_values.reduce(&:and) }.reduce(&:or)
User.left_joins(:event).where(cond)
Свойство where_values
является массивом экземпляров Arel :: Nodes :: Node, каждый из которых обычно and
чтобы получить ваш запрос.Вы должны and
их вручную, а затем or
результаты.
Если что-то не работает должным образом, проверьте вывод cond.to_sql
на случай, если вы что-то пропустили.