Глупый вопрос, но я не уверен, почему это будет работать в 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?
Спасибо за любую помощь.





Я покопался и обнаружил, что:
FamilyCharacteristic.where(family_id: @user.family_ids) не изменился, он по-прежнему ActiveRecord::RelationRelation не определял и до сих пор не определяет свой собственный метод 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.
Отличный поиск, спасибо! Предложения по простому обходному пути? Похоже, что все, что делало это приложение раньше, не могло считаться лучшей практикой.
Вместо concat вы можете просто использовать +, чтобы он работал наиболее похоже - FamilyCharacteristic.where(family_id: @user.family_ids) + @user.characteristics. Существуют также такие методы, как merge - но он использует предложение sql AND, or - использует предложение OR, поэтому это кажется правильным решением, но требует, чтобы отношения были структурно совместимыми, поэтому я не думаю, что это сработает в этом случае.
Интересно, что при использовании concat по ассоциации работает совершенно иначе. Например: SomeModel.where(user: user).concat(some_records) просто создает массив с записями в нем, тогда как user.some_models.concat(some_records) работает как <<, поэтому на самом деле ОБНОВЛЯЕТ some_records, чтобы он принадлежал пользователю.
Я не мог заставить работать +. В конце концов остановился на этом кладже: FamilyCharacteristic.where(family_id: @user.family_ids).to_a.concat(@user.characteristics.to_a), который "работает", но хотел бы получить более элегантное решение.
Я не знаю ваших моделей и ассоциаций, но если @user.characteristics относятся к типу FamilyCharacteristic, вы также можете попробовать что-то вроде FamilyCharacteristic.where(family_id: @user.family_ids).or(FamilyCharacteristic.where(user: @user)), который будет генерировать только один SQL-запрос и позаботиться о возможных дубликатах. Я сделал несколько предположений о ваших моделях, так что это может быть неточным решением.
Что ты хочешь делать? Вы можете показать мне свои модели?