Рельсы: выравнивание "многие ко многим" только с таблицей соединений - PullRequest
1 голос
/ 01 ноября 2011

У меня есть модельный объект, который связан со списком стран, имеющих отношение многие ко многим. Страны обозначены кодами ISO 3166 alpha-2 .

Я хотел бы сохранить для использования класс и таблицу Country, и только у моего объекта есть средство доступа в виде object.countries, которое будет возвращать массив строк, например: ["IL", "US", "IT", ... ].

По сути, это своего рода действие has_and_belongs_to_many только с таблицей соединений. Это возможно?

Существует ли передовая практика в случае списков стран?

1 Ответ

0 голосов
/ 13 ноября 2011

Вот как я в конце концов решил эту проблему: я создал таблицу стран в базе данных, так как предпочел отношения 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

Конечно, я был бы рад услышать любые предложения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...