Если каждая новость, событие и т. Д. Будут принадлежать только одному региону, теги не кажутся наиболее подходящими для IMO.Это оставляет вам 2 варианта:
Добавить поле region_id к каждой модели
Это простейший, но имеет недостаток, который вы будете не иметь возможность просматривать все «регионарные» элементы одновременно - вам придется запрашивать таблицы новостей, событий и т. д. отдельно (или использовать UNION, который ActiveRecord не поддерживает).
Использовать модель RegionLink с полиморфными ассоциациями
Это только немного сложнее и фактически похоже на то, как действует acts_as_taggable_on.Если вы незнакомы, посмотрите документы Rails на * assign_to * для более полного описания полиморфных отношений
class Region < ActiveRecord::Base
has_many :region_links
has_many :things, :through => :region_links
end
# This table with have region_id, thing_id and thing_type
class RegionLink < ActiveRecord::Base
belongs_to :region
belongs_to :thing, :polymorphic => true
end
class Event < ActiveRecord::Base
has_one :region_link, :as => :thing
has_one :region, :through => :region_link
end
# Get all "things" (Events, Projects, etc.) from Region #1
things = Region.find(1).things
Переименование довольно простое - просто переименуйте Регион.Удалить / переназначить регионы также просто - просто удалите запись RegionLink или замените ее region_id.
Если вы обнаружите, что дублируете много кода, относящегося к региону, в моделях событий и т. Д., Вы можете поместитьэто в модуль в lib или app / models:
module Regioned
def self.inluded(base)
base.class_eval do
has_one :region_link, :as => :thing
has_one :region, :through => :region_link
...
end
end
end
class Event < ActiveRecord::Base
include Regioned
end
class Project < ActiveRecord::Base
include Regioned
end