我是一个红宝石菜鸟,我有点难以找到构建我的代码的正确方法。
在代码库中,有一个 Couch 模块用于读取:
module Couch
def self.client
@client ||= Couchbase.new "http://#{DATABASE_HOST}:8091/pools/default"
end
end
每次我们必须访问数据库时,我们都会这样做:
Couch.client.get(...)
Couch.client.set(...)
例如 :
def Model
def self.find(id)
Couch.client.get("foo:#{id}")
...
end
def save
Couch.client.set("foo:#{@id}", {...})
end
end
到处重复 Couch.client 和静态的东西让我很不舒服,我觉得这不是红宝石的方式。
所以我将 Couch 模块更改为
module Couch
extend Forwardable
def_instance_delegators :client, :get, :set, :delete, :append
def client
@@client ||= Couchbase.new "http://#{hostname}:8091/pools/default"
end
end
在想要使用它的模型类中
def Model
extend Couch
def self.find(id)
get("foo:#{id}")
...
end
def save
Model.set("foo:#{@id}", {...})
end
end
我认为它更好,但我必须承认我对它的外观并不完全满意......:get
在我的 Model 中有一个类方法真的可以吗?这个名字有点混乱。是否应该包含该模块(例如带有 ClassMethods 子模块)?我可以避免类变量@@client
(但我不想为每个实例创建一个新连接)吗?
Bref,有没有更好的方法?