Вы можете использовать ActiveSupport::Concern
входящий в комплект крючок, например.
module AConcern
extend ActiveSupport::Concern
included do
attribute :foo, :integer
end
end
Тогда
class Thing < ApplicationRecord
include AConcern
end
Проблема, с которой вы сейчас сталкиваетесь, заключается в том, что attribute
вызывается в контексте вашего Module
, но этот модуль не имеет доступа к этому методу (следовательно, NoMethodError
).
Хук included
запускается при вызове include
, а хук запускается в контексте включающего Object
(Thing
в данном случае). Thing
имеет метод attribute
, и, таким образом, все работает, как ожидалось.
included
блок из ActiveSupport::Concern
по существу такой же, как (в чистом рубине)
module AConcern
def self.included(base)
base.class_eval { attribute :foo, :integer }
end
end