我是一个红宝石菜鸟,我有点苦苦寻找建立我的代码的正确方法。
在代码库中,有一个用于读取的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
类方法真的可以吗?这个名字有点令人困惑。是否应包含该模块(例如,使用ClassMethods子模块)?我可以避免使用类变量@@client
(但我不希望为每个实例创建新连接)?
Bref,有更好的方法吗?
答案 0 :(得分:1)
我认为它更好但我必须承认我对它的外观并不完全满意......在我的模型中有一个:get class方法真的可以吗?这个名字有点令人困惑。是否应包含该模块(例如,使用ClassMethods子模块)?我可以避免使用类变量@@ client(但我不希望为每个实例创建新连接)?
我认为您的模型中不应该有get
类方法;你是对的,没用。
你的原始方法对我来说非常好。
它是明确的,但不是太冗长。任何人都可以轻松理解代码的作用。
答案 1 :(得分:1)
看看http://github.com/couchbase/couchbase-ruby-model和couchbase-model rubygem本身。它做了大部分肮脏的工作。此外,如果您有想法/补丁,我将很乐意审查它们。我正在使用gerrit代码审查,因此最新的补丁在http://review.couchbase.org/#/q/status:open+project:couchbase-ruby-model,n,z