使用模块构建ruby数据库访问代码

时间:2012-10-19 10:05:18

标签: ruby oop couchbase

我是一个红宝石菜鸟,我有点苦苦寻找建立我的代码的正确方法。

在代码库中,有一个用于读取的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,有更好的方法吗?

2 个答案:

答案 0 :(得分:1)

  

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

我认为您的模型中不应该有get类方法;你是对的,没用。

你的原始方法对我来说非常好。

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

答案 1 :(得分: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