создание модели ActiveRecord во время выполнения rails3

#ruby #ruby-on-rails-3 #activerecord #metaprogramming

#ruby #ruby-on-rails-3 #activerecord #метапрограммирование

Вопрос:

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

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

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

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

и я на rails3

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

приветствия

sameera

Комментарии:

1. Итак, вы не написали никакого кода и хотите, чтобы мы написали его за вас?

2. Привет @TinMan, я столкнулся со следующими ресурсами snippets.dzone.com/posts/show/2390 , workingwithrails.com/forums/4-ask-a-rails-expert/topics/… и, похоже, мне следует использовать метод ‘create_class’ в ruby. Но я не уверен, с чего начать. вот почему я разместил это на форуме. Итак, приветствуется любой ресурс, статья, спасибо

Ответ №1:

Заимствуя create_class из статьи, на которую вы ссылались, как насчет чего-то подобного:

 TABLE_NAMES = %w[customers products purchases]

def create_class(class_name, superclass, amp;block)
  klass = Class.new superclass, amp;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) }
  

Ответ №2:

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

модуль ModuleA … end

класс A расширяет ActiveRecord::Базовый модуль включает в себя конец

Класс B расширяет ActiveRecord::Базовый модуль включает в себя конец