0

我们的应用程序接收来自各种提要的数据。

一个提要以数据库的形式提供给我们。因此,我们让这个数据库与我们的应用程序数据库位于同一个 MySQL 服务器实例中。对此提要数据库的进一步更新以增量形式提供,并且必须处理到完整的提要数据库中。

所以我有:

  • app_db
  • feed_db
  • feed_delta_db

feed_dbfeed_delta_db具有相同的结构(表、列等)。

有时我需要访问feed_db,有时我需要访问feed_delta_db.

在我开始接收增量之前,我feed_db是这样访问的:

module Feed
  module Db
    module InstanceMethods
      def something
        puts 'pffffft'
      end
    end

    def self.included(receiver)
      receiver.send :include, InstanceMethods
      receiver.instance_eval {
        establish_connection(
          {
            :adapter => "mysql2",
            :database => "feed_db",
            :username => "mysql_user",
            :password => nil,
            :host => "localhost"
          }
        )
      }
    end
  end

  class FeedModel < ActiveRecord::Base
    include Db
    self.abstract_class = true
  end

  class Sometable < FeedModel
    set_table_name "sometable"
    belongs_to :someothertable, :foreign_key => "SomeothertableID", :primary_key => "id"

    def name
      "#{field1} #{field2}"
    end
  end
end

现在我可以复制所有这些代码feed_delta_db,而我唯一需要更改的是连接详细信息中指定的数据库。

但这不是 DRY,是吗?

结果将是我想要的。我可以像这样访问单独数据库中的表: Feed::SometableFeedDelta::Sometable

如何将我的类定义分离到它们自己的文件中,并将它们包含/需要/无论它们放入单独的模块(或类)中,以便我可以随意访问任一数据库?

让我知道是否有任何不清楚的地方。

谢谢。

4

1 回答 1

1

我会定义一个通用父类,然后在子类中切换数据库

class GenericParent < ActiveRecord::Base
  self.abstract_class = true
end

class Feed < GenericParent
  establish_connection :feed_db
end

class FeedDelta < GenericParent
  establish_connection :feed_delta_db
end

# config/database.yml
development:
  ...

feed_db:
  ...

feed_delta_db:
  ...

尊重不同的环境是明智的。所以你establish_connection可能看起来更像:

class Feed < GenericParent
  establish_connection :"feed_#{Rails.env}"
end

这将允许您在 database.yml 中拥有 feed_development、feed_staging、feed_production 等部分

于 2012-12-17T22:27:40.733 回答