Существует фундаментальное различие между этими двумя методами, которые отсутствуют во всех других ответах, и это реализация STI (наследование одной таблицы) в rails:
http://api.rubyonrails.org/classes/ActiveRecord/Base.html (Найти раздел «Наследование в одной таблице»)
Обычно, если вы реорганизуете базовый класс следующим образом:
class Base < ActiveRecord::Base
def foo
puts "foo"
end
end
class A < Base
end
class B < Base
end
Тогда у вас должна быть таблица базы данных с именем «основы »со столбцом« тип », которая должна иметь значение« А »или« В ». Столбцы в этой таблице будут одинаковыми во всех ваших моделях, и если у вас есть столбец, который принадлежит только одной из моделей, ваша таблица «баз» будет денормализована.
Принимая во внимание, что если вы реорганизуете базовый класс следующим образом:
Module Base
def foo
puts "foo"
end
end
class A < ActiveRecord::Base
include Base
end
class B < ActiveRecord::Base
include Base
end
Тогда не будет таблицы "базы". Вместо этого будет таблица «as» и таблица «bs». Если они имеют одинаковые атрибуты, столбцы должны будут дублироваться в обеих таблицах, но при наличии различий они не будут поменены.
Итак, если одно предпочтительнее другого, да, но это специфично для вашего приложения. Как правило, если они имеют одинаковые свойства или имеют большое перекрытие, используйте STI (1-й пример), иначе используйте модули (2-й пример).