Там нет жесткой защиты.Если кто-то хочет что-то изменить, он, скорее всего, сможет.Но вы можете разработать некоторые меры защиты от случайного столкновения имен.
Например, извлеките метод в его собственное пространство имен:
module ConcernA
extend ActiveSupport::Concern
def print_a
Impl.new.formatted_text
end
class Impl
def formatted_text
"ConcernA"
end
end
end
module ConcernB
extend ActiveSupport::Concern
def print_b
Impl.new.formatted_text
end
class Impl
def formatted_text
"ConcernB"
end
end
end
class MyModel
include ConcernA
include ConcernB
end
MyModel.new.print_a # => "ConcernA"
MyModel.new.print_b # => "ConcernB"
Таким образом, ConcernA::Impl
и ConcernB::Impl
являются двумя несвязанными классами и не влияют друг на друга.