Rails 单表继承

发布于 2024-07-26 18:19:32 字数 44 浏览 9 评论 0原文

对于单表继承,如何强制 Rails 使用整数列而不是字符串作为“类型”列?

For single table inheritance, how do you force Rails to use an integer column for the 'type' column instead of string?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

心碎的声音 2024-08-02 18:19:32

您可以重写 Rails 用于将表名转换为类名的方法,反之亦然:

相关方法是 find_sti_class ,它负责将类型列中存储的值转换为相应的 ActiveRecord 模型,并且sti_name 负责检索存储在给定 ActiveRecord 子类的类型列中的值。

您可以像这样覆盖它们:

class Institution::Base < ActiveRecord::Base

  ALLOWED_CLASSES = %w[Institution::NonProfit Institution::Commercial]

  class << self

    def find_sti_class type_name
      idx = type_name.to_i
      super if idx == 0
      ALLOWED_CLASSES[idx-1].constantize
    rescue NameError, TypeError
      super
    end

    def sti_name
      idx = ALLOWED_CLASSES.index(self.name)
      if idx.nil?
        super
      else
        idx + 1
      end
    end

  end

end

我写了一篇 post 详细阐述更详细地说。

You can override the methods Rails uses to convert the table name to class name and vice versa:

The relevant methods are find_sti_class which is responsible for the translating the value stored in the type column to the respective ActiveRecord model and sti_name which is responsible for retriving the value stored in type column given an ActiveRecord subclass.

You can override them like this:

class Institution::Base < ActiveRecord::Base

  ALLOWED_CLASSES = %w[Institution::NonProfit Institution::Commercial]

  class << self

    def find_sti_class type_name
      idx = type_name.to_i
      super if idx == 0
      ALLOWED_CLASSES[idx-1].constantize
    rescue NameError, TypeError
      super
    end

    def sti_name
      idx = ALLOWED_CLASSES.index(self.name)
      if idx.nil?
        super
      else
        idx + 1
      end
    end

  end

end

I have written a post elaborating this in more detail.

平安喜乐 2024-08-02 18:19:32

您必须找到 ActiveRecord 中负责处理“类型”列的部分并对其进行猴子修补,即覆盖它在应用程序中的工作方式。

You would have to find the part of ActiveRecord responsible for handling the "type" column and monkey patch it, i.e. override how it worked from within your application.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文