如何在database.yml中创建if语句,以便根据rails中的当前用户使用不同的数据库

时间:2014-08-30 15:57:26

标签: mysql ruby-on-rails ruby database ruby-on-rails-4

正如我解释的那样,我想根据用户使用不同的数据库。

我得到了一个用devise创建的伙伴表,我创建了多个数据库。这些数据库中的每一个都具有相同的模式和相同的关系。

我想要完成的事情就像是

default: &default
  adapter: mysql2
  pool: 5
  timeout: 5000

development:
  <<: *default
  database: db_ <%= current_partners%>

# Warning: The database defined as "test" will be erased and
# re-generated from your development database when you run "rake".
# Do not set this db to the same as development or production.
test:
  <<: *default
  database: db_ <%= current_partners%>

production:
  <<: *default
  database: db_ <%= current_partners%>

为什么我不能使用这个陈述?

我正在使用mysql2,如代码片段中所示。

3 个答案:

答案 0 :(得分:1)

database.yml中,只需提及默认数据库配置即可。无论何时,您希望在数据库之间切换,请在命中相应数据库之前调用用户定义的switch_database方法连接到另一个数据库。类似的东西:

def switch_database
  establish_connection (
    :adapter  => "mysql2",
    :host     => "another_host_name",
    :username => "username",
    :password => "password",
    :database => "db_#{current_partner}"
  )
end

将上述方法放在适当的文件中,方便您调用。

答案 1 :(得分:0)

在应用程序启动时加载了

database.yml,此时此类变量不可用,因为它们是特定于请求的。您需要在current_partners中创建所有数据库,然后告诉rails在控制器中使用哪个数据库。然而,这可能会导致很多并发问题(但不确定,从未实际执行过此操作 - 请参阅下文)。

但请注意,这不是最佳做法。为什么不拥有database.yml模型,然后改为使用关联?

答案 2 :(得分:0)

您可能想要查看这些可以帮助您在Rails应用程序here中实现多租户的宝石。

Apartment是一个非常活跃的基于Rack的数据库多租户ruby宝石。我希望它有所帮助。