【发布时间】:2012-10-19 10:05:18
【问题描述】:
我是一个红宝石菜鸟,我有点难以找到构建我的代码的正确方法。
在代码库中,有一个 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 的重复和静态的东西让我很不舒服,我觉得这不是 ruby 方式。
所以我将 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
我认为它更好,但我必须承认我对它的外观并不完全满意......
在我的 Model 中有一个 :get 类方法真的可以吗?这个名字有点混乱。是否应该包含该模块(例如带有 ClassMethods 子模块)?我可以避免类变量@@client(但我不想为每个实例创建一个新连接)吗?
Bref,有没有更好的方法?
【问题讨论】: