создать модель ActiveRecord во время выполнения rails3 - PullRequest
2 голосов
/ 12 мая 2011

Я хочу создать модель ActiveRecord во время выполнения.

В моей системе я создаю несколько отчетов, и все они связываются с таблицей / представлениями базы данных.Таким образом, единственная разница будет в названии таблицы.

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

  • Может кто-нибудь помочь мне с тем, как создать модель ActiveRecord во время выполнения
  • назначить метод области действия

и я на рельсах3

заранее спасибо

ура

Самера

Ответы [ 2 ]

3 голосов
/ 17 мая 2011

Заимствование create_class из статьи, на которую вы ссылались, как насчет этого:

TABLE_NAMES = %w[customers products purchases]

def create_class(class_name, superclass, &block)
  klass = Class.new superclass, &block
  Object.const_set class_name, klass
end

def create_model_class(table_name)
  create_class(table_name.classify, ActiveRecord::Base) do
    scope :in_date_range, lambda {|start_date, end_date| where("start_date >= ?", start_date).where("end_date <= ?", end_date) }
  end
end

TABLE_NAMES.each {|table_name| create_model_class(table_name) }

Если вы хотите использовать все таблицы в базе данных, вы можете сделать это:

TABLE_NAMES = ActiveRecord::Base.connection.tables

Но если вы не относитесь ко всем таблицам одинаково, я полагаю, вы не захотите этого делать.

После того, как вы создали классы моделей, вы сможете печатать объекты из каждой таблицы с соответствующими столбцами:

def print_attributes(model_obj)
  puts model_obj.attributes.map {|k,v| "#{k}=#{v.inspect}" }.join(', ')
end

Customer.in_date_range(Date.today, Date.today + 1.day).each {|c| print_attributes(c) }
Product.in_date_range(Date.yesterday, Date.today + 2.days).each {|c| print_attributes(c) 
Purchase.in_date_range(Date.yesterday, Date.today + 3.days).each {|c| print_attributes(c) }
0 голосов
/ 17 мая 2011

Самый простой способ сделать это, предполагая, что имена представлений статичны, - это создать один модуль с общей функциональностью и затем включить его в базовые модели.

модуль ModuleA ... конец

класс A расширяет ActiveRecord :: Base включает в себя ModuleA конец

Класс B расширяет ActiveRecord :: Base включает в себя ModuleA конец

...