Как смоделировать мультиблог сайт? - PullRequest
2 голосов
/ 27 мая 2009

У меня есть эти таблицы:

**Sites**
:has_many :blogs
:has_many :pages

**Blogs**
:belongs_to :site

**Pages**
:belongs_to :site
:belongs_to :blog

По сути, я хочу иметь возможность создавать страницы, которые либо связаны с сайтом, либо связаны с блогом с такими маршрутами:

/blogs/1/pages/1
/sites/1/pages/2 

С моей текущей настройкой, в моей таблице страниц есть посторонний ключ для blog_id И site_id - и я просто думал сделать это:

  • если страница создается для сайта (то есть она не принадлежит блогу), тогда установите blog_id = в NULL, но соответственно установите site_id

  • но, если страница создается для блога (который уже принадлежит сайту), задайте соответствующий site_id И blog_id

Тогда, если мне нужен список страниц сайта: я могу просто запросить таблицу страниц для всех NULL blog_ids, и если я хочу страницы блога, я получу их уже через отношения с Блогом.

ОБНОВЛЕНИЕ: Я принял ответ ниже, в котором предлагалось использовать «полиморфные ассоциации», но можно ли это сделать с помощью наследования отдельных таблиц? Если так, какой метод лучше?

Спасибо.

Ответы [ 2 ]

5 голосов
/ 28 мая 2009

Вы можете использовать полиморфные ассоциации.

Добавьте внешний ключ и столбец типа в таблицу pages. Найдите прилагательное, которое описывает общее свойство классов, к которым могут принадлежать ваши страницы. Я придумал pageable (что дает мне столбцы pageable_id и pageable_type). Если вы используете миграцию, добавьте следующую вашу Page миграцию:

# Adds "pageable_id" integer column and "pageable_type" string column.
t.references(:pageable, :polymorphic => true)

В ваших моделях укажите полиморфные отношения при использовании has_many / belongs_to:

class Site < ActiveRecord::Base
  has_many :pages, :as => :pageable
end

class Blog < ActiveRecord::Base
  has_many :pages, :as => :pageable
end

class Page < ActiveRecord::Base
  belongs_to :pageable, :polymorphic => true
end

И вот:

# Return all pages belonging to Site with ID 12, that is, return all pages
# with pageable_id 12 and pageable_type "site".
Site.find(12).pages

# Return all pages belonging to Blog with ID 3, that is, return all pages
# with pageable_id 3 and pageable_type "blog".
Blog.find(3).pages

# Returns the owner (Blog or Site) of Page with ID 27.
Page.find(27).pageable

Надеюсь, это поможет.

1 голос
/ 28 мая 2009

Вы должны посмотреть на полиморфные ассоциации: http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html

По сути, вы на правильном пути, но для того, что вы пытаетесь сделать, существует шаблон.

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