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

以数据库的形式向我们提供了一个提要。因此,我们将此数据库与我们的应用程序数据库置于同一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

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

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

谢谢。

最佳答案

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

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


这将使您在数据库中具有feed_development,feed_staging,feed_production等部分。yml

关于mysql - Ruby/Rails-动态指定类的连接属性,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13922959/

10-17 02:53