Это ожидается, потому что так работает ActiveRecord. Если вам нужно установить произвольные атрибуты, вам придется использовать объекты другого типа.
Например, Ruby предоставляет библиотеку под названием
OpenStruct
, что позволяет создавать объекты, которым вы можете назначить произвольный ключ и значения. Если вы хотите получить значение из атрибута без self, он даст вам экземпляр класса OpenStruct с атрибутом экземпляра глобальной переменной. Но если вы хотите установить новый атрибут, он создаст новый экземпляр класса OpenStruct с новыми атрибутами. Без self у вас будут старые объекты OpenStruct, которые не имеют атрибутов и приведут к ошибке.
Возможно, вы захотите использовать такую библиотеку, а затем преобразовать объект в соответствующий экземпляр ActiveRecord, только когда вам нужно сохранить в базе данных.
Не пытайтесь моделировать ActiveRecord, чтобы он вел себя так, как вы только что описали, потому что он просто не был разработан, чтобы вести себя таким образом