#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::Базовый модуль включает в себя конец