Распространение модели / Возможность задавать имя таблицы во время выполнения

#ruby-on-rails #activerecord

#ruby-on-rails #activerecord

Вопрос:

TL; DR — могу ли я задать имя таблицы во время запроса (не set_table_name — не хочу этого на уровне класса) и использовать средства поиска в стиле arel без надлежащего представления модели (foo.rb) в моей кодовой базе?

Длинная версия…

У меня есть два десятка таблиц на складе с согласованной схемой для таблиц:

 date | some_foreign_key | total
  

Допустим, таблицам присвоены имена

 activity_by_foo
activity_by_bar
activity_by_baz
  

Если бы я следовал AR как неотъемлемая часть, у меня было бы три класса модели:

 app/models/activity_by_foo.rb
app/models/activity_by_bar.rb
app/models/activity_by_baz.rb
  

И я могу либо включить модуль в каждый из этих классов для обработки общих запросов, либо написать базовый класс и явно вызвать ‘set_table_name’ в каждой модели, что позволит этому работать:

 class Activity < ActiveRecord::Base
  def self.totals_for_period(start_date, end_date, id) 
     select(:total).where(:start_date => start_date, :end_date => end_date,  :some_foreign_key => id).sum(:total)
  end
end
  

Тем не менее, я хотел бы полностью удалить классы activity_by_foo / bar / baz и сделать что-то более динамичное. Предполагая, что я не добавляю никакого дополнительного поведения к модели, я буквально просто извлекаю данные для представления, могу ли я по-прежнему использовать синтаксис поиска в стиле arel в «виртуальном» классе ActiveRecord (в данном случае Activity) и каким-то образом задавать имя таблицы во время запроса на основе другой доступной мне информации?