Ошибка ActiveRecord :: Relation.concat в Rails 5

Глупый вопрос, но я не уверен, почему это будет работать в Rails 4.2, но не в Rails 5.2.

FamilyCharacteristic.where(family_id: @user.family_ids)
                    .concat(@user.characteristics)

Технические характеристики не соответствуют требованиям в версии 5.2:

Failure/Error:
       FamilyCharacteristic.where(family_id: @user.family_ids)
                           .concat(@user.characteristics)

     NoMethodError:
       undefined method `concat' for #<ActiveRecord::Relation []>
       Did you mean?  count

Был ли concat удален из ActiveRecord::Relation в 5.2 или FamilyCharacteristic.where(family_id: @user.family_ids) каким-то образом был другим объектом в <4.2?

Спасибо за любую помощь.

Что ты хочешь делать? Вы можете показать мне свои модели?

Leticia Esperon 02.11.2018 23:10
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
7
1
1 995
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я покопался и обнаружил, что:

  • Класс FamilyCharacteristic.where(family_id: @user.family_ids) не изменился, он по-прежнему ActiveRecord::Relation
  • Relation не определял и до сих пор не определяет свой собственный метод concat, но он был делегирован Array#concat до эта фиксация произошла, поэтому в Rails 4.2 SomeModel.where(id: ids).concat(some_records) (который возвращает Array) был фактически таким же, как SomeModel.where(id: ids).to_a.concat(some_models)
  • После упоминалось перед изменением в ActiveRecord::Delegation, в Rails 5.2, Array делегированы только методы, указанные в этом модуле, а concat среди них нет.

Подводя итог - concat из вашего примера никогда не был частью ActiveRecord, но был делегирован Array#concat, и поэтому он работал. Он больше не делегирован в Rails 5, поэтому выбрасывает NoMethodError.

Отличный поиск, спасибо! Предложения по простому обходному пути? Похоже, что все, что делало это приложение раньше, не могло считаться лучшей практикой.

Meltemi 04.11.2018 19:50

Вместо concat вы можете просто использовать +, чтобы он работал наиболее похоже - FamilyCharacteristic.where(family_id: @user.family_ids) + @user.characteristics. Существуют также такие методы, как merge - но он использует предложение sql AND, or - использует предложение OR, поэтому это кажется правильным решением, но требует, чтобы отношения были структурно совместимыми, поэтому я не думаю, что это сработает в этом случае.

ahawrylak 05.11.2018 10:19

Интересно, что при использовании concat по ассоциации работает совершенно иначе. Например: SomeModel.where(user: user).concat(some_records) просто создает массив с записями в нем, тогда как user.some_models.concat(some_records) работает как <<, поэтому на самом деле ОБНОВЛЯЕТ some_records, чтобы он принадлежал пользователю.

ahawrylak 05.11.2018 10:29

Я не мог заставить работать +. В конце концов остановился на этом кладже: FamilyCharacteristic.where(family_id: @user.family_ids).to_a.concat(@user.characteristics.to_a), который "работает", но хотел бы получить более элегантное решение.

Meltemi 06.11.2018 19:12

Я не знаю ваших моделей и ассоциаций, но если @user.characteristics относятся к типу FamilyCharacteristic, вы также можете попробовать что-то вроде FamilyCharacteristic.where(family_id: @user.family_ids).or(FamilyCharacteristic.where(user: @user)), который будет генерировать только один SQL-запрос и позаботиться о возможных дубликатах. Я сделал несколько предположений о ваших моделях, так что это может быть неточным решением.

ahawrylak 06.11.2018 20:10

Другие вопросы по теме