0

我是一个红宝石菜鸟,我有点难以找到构建我的代码的正确方法。

在代码库中,有一个 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,有没有更好的方法?

4

2 回答 2

1

我认为它更好,但我必须承认我对它的外观并不完全满意......在我的模型中有一个 :get 类方法真的可以吗?这个名字有点混乱。是否应该包含该模块(例如带有 ClassMethods 子模块)?我可以避免类变量@@client(但我不想为每个实例创建一个新连接)吗?

我认为您get的模型中不应该有类方法;你说得对,这毫无意义。

你原来的方法对我来说很好。

它是明确的,但不是太冗长。任何人都可以轻松理解代码的作用。

于 2012-10-19T12:32:38.527 回答
1

看看http://github.com/couchbase/couchbase-ruby-model和 couchbase-model ruby​​gem 本身。它完成了大部分肮脏的工作。此外,如果您有想法/补丁,我很乐意对其进行审查。我正在使用 gerrit 代码审查,因此最新的补丁在这里http://review.couchbase.org/#/q/status:open+project:couchbase-ruby-model,n,z

于 2012-10-20T03:33:16.540 回答