Есть 2 варианта: наследование и concerns (ака mixin'ы). Основные отличия в смысловой нагрузке, которую вы вкладываете в отношения этих классов.
Если Б это подкласс А, то логичнее использовать наследование. Пример - 'Автомобиль' и 'ВАЗ 2109'
Если А и Б разнородные сущности, имеющие некий общий функционал то логичнее использовать concerns. Пример - 'Автомобиль' и 'Лифт' могут иметь общий функционал связанный с погрузкой пассажиров.
А возможно ли указать определение схемы всех общих аттрибутов для миграции будущих таблиц в concern, чтобы не определять для каждой модели схему миграции, а уже подключать общие и дописывать дополнительные?
Думаю возможно. Но это будет уже отдельный модуль для миграций. В нем создаете функцию, в которой вызываются методы add_column, add_index и т.п. Далее делаете include в классе миграции и вызываете эту функцию в up. Но у меня большой вопрос в целесообразности. Миграции по сути это одноразовый код, рефакторить его вы будете с помощью новых миграций. Мое мнение - в данном случае более верно использовать копи-паст.