我需要從數據庫的各個表中檢索列名,以便爲這些表對應的類動態設置attr_accessor
方法。這需要從父類完成。根據數據庫/表列動態設置子類的屬性
class Child < Parent
attr_accessor :id, :column_a, :etc.
end
Parent
的#column_names
方法確實工作,我打算給它的方式。它爲任何由子類指定的表返回一個列名稱數組。然而,它從#inherited
方法調用時不返回任何列名稱。當我嘗試爲子類設置attr_accessor
方法時,將返回一個空數組。
我在嘗試動態設置這些attr_accessor
方法,使用#class_eval
將它們插入到子類中。這是對#column_names
的調用發生的位置,以及返回空數組的位置。
module SomeModule
class Parent
def self.inherited(child)
child.class_eval do
self.column_names.each { |att| attr_accessor att.to_sym }
end
end
#...
def self.table_name
"#{self.to_s.downcase}s"
end
def self.column_names
sql = "#... WHERE table_name = '#{table_name}';"
columns = []
exec(sql).each do |col-data|
columns << col_data["column_name"]
end
columns
end
def self.exec(sql, args=[])
#...
end
#...
end
end
我的理解是,這本質上應該建立一個呼叫從Child
到Child.column_names
其中,我認爲它。我只是不知道爲什麼返回數組沒有填充。我已經嘗試過移動column_names
方法,但行爲的唯一變化取決於它的放置位置,它是子類的NoMethodError
。
你能舉個模塊的使用例子嗎? –
@max pleaner該模塊基本上是一個ORM - 只是ActiveRecord的超輕量級版本。 –