2010-03-01 4 views
2

Я ищу некоторую помощь по созданию db. У меня есть существующего приложения, которые я хотел бы добавить следующие функции:Добавление функции блога в существующее приложение Rails

  • Поддержка концепции Блог сайта
  • Разрешить членам каждого есть свой собственный блог
  • Администраторы могут отправлять сообщения на сайт Блог
  • Пользователи могут отправлять сообщения в свой собственный блог член

Поскольку сайт может иметь только один блог, и каждый член может иметь только один блог. Я не думаю, что мне нужен блог. Вместо этого я просто повесить пару столбцов из таблиц Сайты и Пользователи для blog_name, blog_tagline или что-то еще.

Мой вопрос: следует ли использовать одну таблицу для сообщений или использовать 2 таблицы (site_posts и member_posts).

Если я использую 1 таблицу, я могу легко иметь столбец типа (сайт или элемент) и столбец content_id, указывающий на соответствующую родительскую запись (сайт или член). Но я думаю, что это лучший способ сделать это с точки зрения ресурсов и контроллеров. Если у меня будет 1 таблица, то у меня будет один контроллер. Но, основываясь на роли пользователя, они будут обновлять либо сообщения Сайта, либо сообщения членов. Это кажется немного беспорядочным, всегда проверяя роль пользователя только для обновления ресурса.

Итак, я склоняюсь к 2 ресурсам (и 2 таблицам), поэтому я знаю, что члены всегда работают над member_posts и администраторами на site_posts.

У кого-нибудь есть мысли по этому дизайну или какие-либо проблемы?

Спасибо.

ответ

1

Вы можете рассмотреть один стол (сообщения), но два подкласса (SitePost и MemberPost), которые наследуют его. Это позволяет поместить большую часть функциональности в пост-модель.

Вы можете даже положить большую часть функциональных возможностей контроллера в PostsController

Вы можете иметь два контроллера подкласса для SitePostController и MemberPostController - которые наследуют от PostController ... но имеют разные before_filters для конкретных требований к безопасности ресурсов ,

... На самом деле, вы даже можете уйти с одним сервером PostsController и иметь каждый из двух подклассов свой собственный «can_be_edited_by»? метод ... который вызывается в before_filter для методов-членов вашего сообщения. Просто убедитесь, что сообщение создается на правильном типе, что может потребовать некоторой магии маршрутизации для «post_type» для вашего контроллера. например:

class Post < ActiveRecord::Base 
    ...post-specific methods 
end 
class MemberPost < Post 
    def can_be_edited_by?(user) 
    ... MemberPost-specific authorisation 
    end 
end 
class SitePost < Post 
    def can_be_edited_by?(user) 
    ... SitePost-specific authorisation 
    end 
end 

class PostsController <... 
    before_filter :requires_login 
    before_filter :fetch_post, :only => [:edit, :update, :delete, :show] 
    before_filter :can_edit_post, :only => [:edit, :update, :delete, :show] 

    ... 
    def can_edit_post 
    @post.can_be_edited_by?(current_user) 
    end 
    def fetch_post 
    post_class = (params[:post_type] || 'SitePost').constantize 
    @post = post_class.find(params[:id]) 
    end 

end 

Routing магии (и любые ошибки) в качестве упражнения для читателя;)

+0

Спасибо, я ценю комментарии. Думаю, мне интересно, есть ли какая-то особая выгода для этого подхода. Ваш подход более суровый, чем для двух таблиц. Это главное преимущество? –

+0

да - это главное преимущество. –