Вообще слабо понял задачу, точнее, то, как вы ее решаете, но это
Country.alternames.find_by(name: 'Вася')
Ясное дело не прокатит, потому что has_many да и все другие возможные связи имеет экземпляр класса, а не класс.
То есть, работать у Вас должно что-то вроде
Country.first.alternames
Скорее всего, Вам здесь нужно что-то вроде:
Country.where(alternames: { name: "Вася" })
Или вариации (например, добавить join, убрать класс нэйм и т.д., уже по контексту)
UPD:
Я бы в Вашем случае сделал
concern# app/models/concerns/alternameable.rb
module Alternameable
extend ActiveSupport::Concern
def self.included(base)
base.class_eval do
def has_altername_for?(name)
joins(:alternames).where(name: name, alternameable_type: self.name).present?
end
end
end
module ClassMethods
end
end
И подключал к каждому классу
class Country
include Alternameable
end