Rails: одна модель унаследованного комментария против двух слегка отличающихся моделей комментариев - PullRequest
0 голосов
/ 26 декабря 2011

У меня есть текущая (упрощенная) модель настройки - в основном две очень разные модели:

Product
- Title

Restaurant
- Title

Comment
- Message
- gps_cords (sometimes?!)

Моя цель - позволить людям оставлять комментарии как products, так и restaurants по своему усмотрению, исходя из следующих критериев:

  1. Когда кто-то комментирует продукт, комментарий должен просто иметь message.
  2. Когда кто-то комментирует ресторан, комментарий должен иметь значение message И gps_cords.

Вот что я рассматриваю:

Сценарий 1: Одна большая таблица задниц с моделями наследования

class Product < ActiveRecord::Base
  has_many :product_comments
end

class Restaurant < ActiveRecord::Base
  has_many :restaurant_comments
end

class Comment < ActiveRecord::Base
  # message -> string
  # gps_cords -> string
  # type -> string
end

class ProductComment < Comment
  # only uses message
  belongs_to :product
end

class RestaurantComment < Comment
  # uses message AND gps_cords
  belongs_to :restaurant
end

Сценарий 2: «Дублирование» усилий с двумя моделями комментариев

class Product < ActiveRecord::Base
  has_many :product_comments
end

class Restaurant < ActiveRecord::Base
  has_many :restaurant_comments
end

class ProductComment < ActiveRecord::Base
  # message -> string
  belongs_to :product
end

class RestaurantComment < ActiveRecord::Base
  # gps_cords -> string
  # message -> string
  belongs_to :restaurant
end

Как правильно смоделировать это с учетом:

  1. Производительность
  2. Возможность запроса "Все комментарии"
  3. "Рельсовый путь"? (если есть)
  4. Куда делись индексы?

Большое спасибо людям, которые нашли время, чтобы прочитать все это.

1 Ответ

0 голосов
/ 26 декабря 2011

Используйте Single Table Inheritance (STI), как в сценарии 1.
Вот ссылка для лучшего понимания этого:
http://code.alexreisner.com/articles/single-table-inheritance-in-rails.html

Кроме того, просмотрите вопрос, на который дан ответв комментарии выше от Finbarr.

...