2014-02-20 3 views
2

Приложение 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.

ответ

1

Рассматривая проблему, у вас есть в основном две модели с различными атрибутами и поведением.

Один из подходов - создать родительский класс с наследованием 2-х под-класса от родительского класса.

class Article

class Review < Article & class Interview < Article

Используя подход одной таблицы наследования (STI), вы просто создать столбец типа, который будет дифференцироваться два и имеет валидацию и столбцы заселить на основе класса к югу.

+0

Должен ли я иметь все столбцы, необходимые для обеих моделей на одной и той же таблице? –

+0

Если вам нужны они в одной таблице, да и проверка будет основана на классе – jamesy829

Смежные вопросы