db design: общие комментарии, несколько типов постов - PullRequest
1 голос
/ 19 мая 2011

У меня есть несколько таблиц, скажем, например: статьи, мысли и страницы, и я хочу иметь возможность добавлять комментарии для каждой из них. Должен ли я добавить таблицы комментариев для каждого элемента таблицы (article_comments, pages_comments ...) или как-то сделать общую таблицу комментариев для всех видов данных (плз, как это реализовать в рельсах, если можете)

У меня была идея сделать таблицу комментариев, содержащую

ID [КОММЕНТАРИИ], МОДЕЛЬ, МОДЕЛЬ_ID, USER_ID, TEXT

хотя модель содержит таблицу назначения (статьи / сообщения ...) и model_id внешний идентификатор в таблице, это хорошее решение? проблема в том, что я понятия не имею, как реализовать такую ​​модель в рельсах.

Мне также хотелось бы знать, как Facebook реализовал свои посты дб. Пользователь fb может публиковать любые данные (вопрос / статус / опрос / изображение), и они просто помещаются в таблицу каналов с текущим порядком и комментариями.

Ответы [ 2 ]

1 голос
/ 19 мая 2011

создайте общую Comment модель и сделайте ее полиморфной, например:

class Comment < ActiveRecord::Base
  belongs_to :commentable, :polymorphic => true
end

class Article < ActiveRecord::Base
  has_many :comments, :as => :commentable
end

class Thought < ActiveRecord::Base
  has_many :comments, :as => :commentable
end

. Из экземпляра модели Article вы можете получить коллекцию комментариев: @article.comments

Если у вас есть экземпляр модели Comment, вы можете обратиться к его родителю через @comment.commentable

. Чтобы это работало, вам нужно объявить как столбец внешнего ключа, так и столбец типа вмодель, которая объявляет полиморфный интерфейс:

class CreateComments < ActiveRecord::Migration
  def self.up
    create_table :comments do |t|
      t.text       :content
      t.references :user
      t.references :commentable, :polymorphic => true
      t.timestamps
    end
  end

  def self.down
    drop_table :comments
  end
end
0 голосов
/ 19 мая 2011

Я подозреваю, что «статьи», «мысли» и «страницы» больше похожи, чем не похожи, и, возможно, должны быть в одной таблице.Тогда этот вопрос уходит.

...