我正在开发一个项目来重新创建 ActiveRecord 的一些功能。这是不起作用的部分
module Associations
def belongs_to(name, params)
self.class.send(:define_method, :other_class) do |name, params|
(params[:class_name] || name.camelize).constantize
end
self.class.send(:define_method, :other_table_name) do |other_class|
other_class.table_name
end
.
.
.
o_c = other_class(name, params)
#puts this and other (working) values in a query
query = <<-SQL
...
SQL
#sends it off with db.execute(query)...
我正在构建这个测试文件:
require 'all_files' #holds SQLClass & others
pets_db_file_name = File.expand_path(File.join(File.dirname(__FILE__), "pets.db"))
DBConnection.open(pets_db_file_name)
#class Person
#end
class Pet < SQLClass
set_table_name("pets")
set_attrs(:id, :name, :owner_id)
belongs_to :person, :class_name => "Person", :primary_key => :id, :foreign_key => :owner_id
end
class Person < SQLClass
set_table_name("people")
set_attrs(:id, :name)
has_many :pets, :foreign_key => :owner_id
end
.
.
.
我没有收到任何更改
.../active_support/inflector/methods.rb:230:in `block in constantize': uninitialized constant Person (NameError)
只是为了确保在文件中加载类的顺序存在问题,我从空的 Person 类开始文件,正如预测的那样,它给了我
undefined method `table_name' for Person:Class (NoMethodError)
由于这是一个学习项目,我不想更改测试以使我的代码正常工作(打开所有类,设置所有表/属性,然后重新打开它们belongs_to
。但是,我不知道如何继续。 )
编辑 SQLClass:
class SQLClass < AssignmentClass
extend SearchMod
extend Associations
def self.set_table_name(table_name)
@table_name = table_name
end
def self.table_name
@table_name
end
#some more methods for finding rows, and creating new rows in existing tables
并且 AssignmentClass 的相关部分使用send
onattr_accessor
来提供功能set_attrs
并确保在您initialize
创建一个类的新实例之前,所有名称都与使用设置的名称匹配set_attrs
。