Вот как я в конце концов решил эту проблему: я создал таблицу стран в базе данных, так как предпочел отношения HABTM.
Но для упрощения я переопределил оператор <<
в коллекции, чтобы можно было просто вставить коды стран в виде строки или массива строк (object.country << 'IL'
):
has_and_belongs_to_many(:countries) do
def <<(country)
if [*country].all? {|c| c.is_a?(String) }
countries = Country.where(:code => country)
concat(*countries)
else
concat(country)
end
end
end
Вы можете распознать этот [*...]
трюк из здесь .
Передача concat(*countries)
также заставляет Rails вставлять все строки в одну транзакцию, что является хорошим бонусом.
И добавил функцию для возврата упрощенного хэша кодов в страны:
def countries_hash
return self.countries.map {|c| { c.code => c.name }}.inject({}) {|hash, elem| hash.merge!(elem)}
end
Конечно, я был бы рад услышать любые предложения.