【问题标题】:Conditional class inheritance for rails modelrails模型的条件类继承
【发布时间】:2012-01-26 13:43:49
【问题描述】:

我有一个多租户 Rails 应用程序正在运行。 我希望范围为当前租户的模型(如此处的本文模型)继承租户范围模型,如下所示

class Article < TenantScoped

end

这很好用。我只接收范围为当前租户的对象。

但现在我正在创建一个管理界面,我希望能够在其中向所有租户添加文章。但是我的管理界面充当租户,并且模型的范围是它。 最后没有显示任何条目。

我建议最好的解决方案是像这样有条件地从租户范围模型继承

class Article

  unless SudoTenant.current?
    < TenantScoped
  else
    < ActiveRecord::Base
  end

end

我一直在寻找 ruby​​ 类的条件继承,但还没有找到任何东西。我的语法在这里是错误的,或者这甚至可能吗?

提前致谢

【问题讨论】:

  • 这是不可能的。您可以根据状态条件有条件地包含模块,但不能继承。

标签: ruby-on-rails class inheritance model


【解决方案1】:

您可以使用块语法定义类:

if SudoTenant.current?
  Article = Class.new(ActiveRecord::Base) do
    # your code
  end
else
  Article = Class.new(TenantScoped) do
    # your code
  end
end

我强烈建议使用 mixins 而不是条件继承,它更干净、更清晰、更明显。

【讨论】:

    【解决方案2】:

    不完全符合您的要求,但我恰好在做 相同 的事情(租户应用程序上的全局文章),我刚刚为管理员创建了一个租户,以便在我的全局中使用它文章。

    我有这样的东西:

    #article.rb
    def self.global
      unscoped.where(:company => Company.admin)
    end
    
    
    #company.rb
    def self.admin
      where(:name => 'admin').first # this can pretty much be anything that fits to you.
    end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多