我有SQLite3 gem,我只能为数据库初始化一次。假设我method1
调用method2
十次,调用method3
二十次,这需要访问SQLite数据库并更新一些记录。如果我在method3
内初始化它,我最终会得到100多个SQLite3实例。 Method1,method2和method3都属于不同的类。
我通过在顶层创建新实例,然后将其传递到method1
,然后传递到method2
和method3
来解决它。这是不可持续的,因为如果我使用两个或三个以上的参数(比如我还有三个method3
将更新的数据库),那么会有很多冗余参数。
我该如何解决这个问题?一些想法正在创建一个全局变量或一个常量,它将在程序初始化时开始。另一个,覆盖new
方法。我不知道每个的优点和缺点。如果你知道其他方法,或者上述两种方法的优点/缺点/可行性,请告诉我。
这是一个示例代码:
require 'sqlite3'
class A
db = SQLite3::Database.new('somename.sqlite')
def call_other_method
B.new.other_method
end
end
class B
def other_method
C.new.other_method_2
end
end
class C
def other_method_2
# I want to call here methods on db, without passing it as an arg, first
# to call_other_method, then to other_method and then to other_method_2
end
end
A.new.call_other_method
答案 0 :(得分:0)
一种方法可能是:
module Sqlite3Connection
require 'sqlite3'
def self.connection
@@db ||= SQLite3::Database.new('somename.sqlite')
end
end
require 'sqlite3_connection'
class SQLite3Record
include Sqlite3Connection
attr_reader :db
def initialize
@db = SQLite3Connection.connection
end
end
class A < SQLite3Record
def call_other_method
# did you mean this?:
10.times{ B.new.other_method }
# or?:
# b = B.new
# 10.times { b.other_method }
end
end
class B < SQLite3Record
def other_method
# did you mean this?:
20.times{ C.new.other_method_2 }
# or?:
# c = C.new
# 20.times { c.other_method2 }
end
end
class C < SQLite3Record
def other_method_2
# will be called 200 times!
# will have single instance of "SQLite3::Database" here accessible via method db.
db.execute(sql)
end
end
A.new.call_other_method