Предположим, у меня есть следующие два объекта:
first_name_relation = User.where(:first_name => 'Tobias') # ActiveRecord::Relation
last_name_relation = User.where(:last_name => 'Fünke') # ActiveRecord::Relation
Можно ли объединить два отношения, чтобы получить один ActiveRecord::Relation
объект, содержащий оба условия?
Примечание. Мне известно, что я могу объединить усилия, чтобы получить такое поведение, что меня действительно интересует, так это случай, когда у меня есть два отдельных ActiveRecord::Relation
объекта.
ruby-on-rails
rails-activerecord
arel
Патрик Клингеманн
источник
источник
Ответы:
Если вы хотите объединить, используя
AND
(пересечение), используйтеmerge
:Если вы хотите объединить, используя
OR
(объединение), используйте † :or
† Только в ActiveRecord 5+; для 4.2 установите где-либо бэкпорт.
источник
ActiveRecord::Relation
типом?merge
это пересечение, а не объединение.#or
метод был добавлен в ActiveRecord :: Relation в январе 2015 года и станет частью Rails 5.0 , который выйдет в конце 2015 года. Он позволяет использовать оператор OR для объединения предложений WHERE или HAVING. Вы можете оформить заказ HEAD, если вам это нужно, до официального релиза. См. Запрос на объединение средств # 16052 @Arcolye @AndrewMarshall @ Aldo-xoen-GiambellucaОбъекты отношений могут быть преобразованы в массивы. Это сводит на нет возможность использовать любые методы ActiveRecord впоследствии, но мне это не нужно. Я сделал это:
Рубин 1.9, рельсы 3.2
источник
merge
на самом деле не работает, какOR
. Это просто пересечение (AND
)Я боролся с этой проблемой, чтобы объединить объекты ActiveRecord :: Relation в один, и я не нашел никакого рабочего решения для себя.
Вместо того, чтобы искать правильный метод создания объединения из этих двух множеств, я сосредоточился на алгебре множеств. Вы можете сделать это по-другому, используя закон де Моргана
ActiveRecord предоставляет метод слияния (AND), а также вы можете использовать метод not или none_of (NOT).
Вы здесь (A u B) '= A' ^ B '
ОБНОВЛЕНИЕ: Решение выше подходит для более сложных случаев. В вашем случае чего-то такого будет достаточно:
источник
Я был в состоянии сделать это, даже во многих нечетных ситуациях с помощью встроенного в Rails' Arel .
Это объединяет оба отношения ActiveRecord с использованием Arel или .
Слияние, как было предложено здесь, не работает для меня. Он отбросил 2-й набор объектов отношений из результатов.
источник
Существует камень под названием active_record_union который может быть тем, что вы ищете.
Пример использования следующий:
источник
ransack
иacts-as-taggable-on
сохраняя при этом своиActiveRecord
экземпляры нетронутыми.Вот как я «обработал» это, если вы используете pluck для получения идентификатора для каждой из записей, соединяете массивы вместе и затем, наконец, делаете запрос для этих соединенных идентификаторов:
источник
Если у вас есть массив отношений activerecord и вы хотите объединить их все, вы можете сделать
источник
array.inject(:merge)
не работал для массива отношений activerecord в рельсах 5.1.4. Ноarray.flatten!
сделал.Грубая сила это:
источник