У меня есть устаревший db (oracle), в этом db У меня есть несколько таблиц, которые содержат разные данные, но структурно одинаковы. Мне не разрешено изменять схему БД каким-либо образом!Как динамически установить имя_таблицы модели?
Мне нужна СУХАЯ модель ActiveRecord для получения правильных данных из правых таблиц. Проблема заключалась в том, что мне нужно было динамически перезаписать self.table_name
, чтобы он работал.
Вот мой код:
ActiveRecord: Базовый класс который будет наследоваться всеми подобными таблицами
class ListenLoc < ActiveRecord::Base
@@table_name = nil
def self.table_name
@@table_name
end
default_scope { where(validated: 1).where("URL_OK >= 0") }
scope :random_order, -> { order('DBMS_RANDOM.VALUE') }
scope :unvalidated, -> { unscope(:where).where(validated: 0) }
def self.get_category(cat_id)
where("cat_id = ?", cat_id)
end
def self.rand_sample(cat_id, lim)
where("cat_id = ?", cat_id).random_order.limit(lim)
end
end
по уходу за детьми Классы выглядеть так:
class ListenLocA < ListenLoc
@@table_name = 'LISTEN_ADDR_A'
self.sequence_name = :autogenerated
belongs_to :category, class_name: 'ListenLocCatA', foreign_key: 'cat_id'
belongs_to :country, class_name: 'Country', foreign_key: 'country_id'
end
B.
class ListenLocB < ListenLoc
@@table_name = 'LISTEN_ADDR_B'
self.sequence_name = :autogenerated
belongs_to :category, class_name: 'ListenLocCatB', foreign_key: 'cat_id'
belongs_to :country, class_name: 'Country', foreign_key: 'country_id'
end
Приведенные выше работы, однако, я уже заметил, что при выполнении определенных выборочных поисков есть некоторые подводные камни.
Это хороший подход? Есть ли лучший способ передать self.table_name
динамически?
Update:
Казалось бы, что это должно работать, но я получаю сообщение об ошибке, что таблица не существует, так как ActiveRecord пытается проверить таблицу перед созданием объекта и self.table_name не установлен в модели ListenLoc динамически.
class ListenLocB < ListenLoc
self.table_name = 'LISTEN_ADDR_B'
self.sequence_name = :autogenerated
belongs_to :category, class_name: 'ListenLocCatB', foreign_key: 'cat_id'
belongs_to :country, class_name: 'Country', foreign_key: 'country_id'
end
Лично у меня были бы разные модели для каждой таблицы в вашем случае. Вы можете извлечь подобный код в 'ListenLoc' в группу –