【问题标题】:Architecturing ruby database access code with module使用模块构建 ruby​​ 数据库访问代码
【发布时间】: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,有没有更好的方法?

【问题讨论】:

    标签: ruby oop couchbase


    【解决方案1】:

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

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

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

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

    【讨论】:

      【解决方案2】:

      看看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-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-12
      • 2019-04-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多