2012-04-02 4 views
2

У меня есть устаревшая БД, где два довольно похожих типа объектов хранятся в разных таблицах, с разными столбцами и отношениями. Для преодоления разрыва существует родительский класс, но я немного потерял его, чтобы реализовать его для эмуляции дочерних классов. В идеале такие методы, как find_all_by_*, должны выполняться в обоих подклассах и возвращать все результаты в одном массиве. Есть ли какой-то канонический способ сделать это, проще, чем копирование the code of find?Rails: Как реализовать find * для абстрактного класса?

+0

Как насчет создания представления в БД? – Yanhao

ответ

0

Хорошо, интересный вопрос. Не уверен, есть ли лучшее решение, чем это, но я бы использовал немного недостающей магии.

class MyVirtualModel 

    def respond_to?(method, include_private = false) 
    if method.to_s =~ /^find.*/ 
     RealModel1.respond_to?(method, include_private) && RealModel2.respond_to?(method, include_private?) 
    else 
     false 
    end 
    end 

    def method_missing(method, *arguments, &block) 
    if method.to_s =~ /^find.*/ 
     resultset1 = RealModel1.send(method, arguments) 
     resultset2 = RealModel2.send(method, arguments) 
     return resultset1 + resultset2 
    end 
    end 

end 
+0

Аккуратное решение, но похоже, что весь этот блок обходит: 'PG :: Ошибка: ERROR: отношение" "не существует'. 'binding.pry' в обоих методах не помогло - они не вызываются веб-сервером Rails. – l0b0

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