Приложение Rails, которое я разрабатываю, имеет две модели: Review
и Interview
. Они оба являются по существу статьями, но они различаются по своим атрибутам и поведению.Объединение двух моделей ActiveRecord в один
Некоторые страницы приложения должны отображать отзывы и интервью вместе, как если бы они были из той же модели. Это означает, что мне как-то нужно объединить их в одну модель, а затем использовать указанную модель как «прокси».
Я достиг основного результата путем реализации Article
модели со следующим кодом:
class Article
MODELS = [Review, Interview]
def self.fetch(&block)
block = Proc.new { all } unless block_given?
results = []
MODELS.each do |model|
suppress(StandardError) do
results.push(*model.class_eval(&block))
end
end
results
end
end
Это дает мне базовую функциональность, что мне нужно. Теперь я могу использовать что-то вроде Article.fetch { where("created_at >= ?", 10.days.ago.to_date) }
, и тот же запрос будет запущен на обеих моделях, давая мне массив результатов (не отсортированный по дате, а на самом деле с отзывами и интервью, разделяемыми вместе, поскольку они исходят из двух разных запросов).
Этот подход, похоже, работает, но он также имеет некоторые важные недостатки.
Главное, что любая сортировка должна быть выполнена вручную после запроса, если вы хотите, чтобы результаты были правильно отсортированы.
У меня нет проблем с внедрением моих собственных методов для решения проблем, с которыми я сталкиваюсь, но мне интересно, существует ли еще стандарт для достижения этого в Rails.
Должен ли я иметь все столбцы, необходимые для обеих моделей на одной и той же таблице? –
Если вам нужны они в одной таблице, да и проверка будет основана на классе – jamesy829