【问题标题】:Defining a Dynamic Table Name Prefix in Rails在 Rails 中定义动态表名前缀
【发布时间】:2021-01-21 13:44:11
【问题描述】:

我正在使用 Rails 应用程序访问 Dynamics NAV 数据库(今天称为 Dynamics 365 Business Central)。为了使其成为多租户,他们使用表名前缀例如:Company 1$Warehouse EntryCompany 2$Warehouse Entry 对数据库进行分区。

我想使用在我的User 模型中定义的字段来设置它访问的公司名称。

为了访问模型中的当前用户,我在 application_controller.rb 上使用了以下内容

before_action -> { User.current = current_user }

然后我设置了一个基类,它声明了以下实例方法:

def self.set_company_name
  company = User.current.nav_company ? User.current.nav_company + "$" : "Company 1$"
  self.table_name = company + self.table_name
end

我也尝试使用实例变量@@company,但在阅读后我看到rails中的表名被缓存了。

我所做的工作有效,但前提是您重新启动应用程序。表名在运行时不会改变。

我怎样才能使它动态化?我看到了这个Question,但答案没有显示如何做到这一点。

【问题讨论】:

  • Company 1$Warehouse EntryCompany 2$Warehouse Entry 是不同的表吗?
  • 是的。两张不同的桌子
  • ActiveRecord 模式假装,至少在 Ruby on Rails 实现中,数据库上的每个表都必须与一个模型相关联。有一个令人信服的理由为两个不同的表使用相同的用户模型类?
  • 是的。它们是相同的模型,只是表名前缀不同。

标签: ruby-on-rails activerecord ruby-on-rails-5 rails-activerecord


【解决方案1】:

我对 Dynamics 365 一无所知,我不明白为什么要将两个表关联到一个模型,但我曾使用过 schemas/namespaces in postgresql,例如:config.users 其中config 是架构和users 表名;所以你可以像select * from config.users一样使用它。

Rails 可以轻松适应这种结构,就像您看到的 here

【讨论】:

  • schema/namespaces 不是我要找的...问题是更改是在表名上,而不是在模式上。也许有一种方法可以避免在 Rails 中缓存表名。
猜你喜欢
  • 1970-01-01
  • 2013-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-15
  • 2016-07-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多