Rails ассоциируется практически со всеми другими моделями - PullRequest
3 голосов
/ 15 января 2012

Я ищу несколько советов о том, как бороться с «регионами» в моей системе.Почти все другие модели в системе (новости, события, проекты и т. Д.) Должны иметь регион, по которому они могут быть отсортированы.До сих пор я рассматривал модель Region с has_many: through для таблицы RegionLink.У меня никогда не было модели, присоединенной ко многим другим, и я удивляюсь, есть ли у этого маршрута какие-то недостатки.Я также подумал об использовании гем act_as_taggable_on и просто помечаю регионы моделями.Это выглядит нормально, но мне придется написать больше кода типа очистки для обработки переименования или удаления региона.

Что бы я ни выбрал, мне нужно обработать переименование и, что более важно, удаление регионов.Если регион будет удален, я, вероятно, просто предоставлю пользователю выбор другого региона для замены ассоциации.

Любые советы по обработке этого с благодарностью.

Ответы [ 2 ]

4 голосов
/ 19 января 2012

Если каждая новость, событие и т. Д. Будут принадлежать только одному региону, теги не кажутся наиболее подходящими для 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
0 голосов
/ 22 января 2012

Оформить актерский состав о полиморфных ассоциациях. Они немного изменились в рельсах 3: http://railscasts.com/episodes/154-polymorphic-association?view=asciicast

...