gpt4 book ai didi

ruby-on-rails - ActiveRecord 自定义类型命名方案

转载 作者:数据小太阳 更新时间:2023-10-29 07:00:30 27 4
gpt4 key购买 nike

我正在处理一个表,该表已有一个包含自然类型名称的列。例如。已经存在一个名为“provider”的列,其值为“foo”或“bar”。我想使用 existing 类型名称在此表上使用 STI,因为必须添加一个名为“type”的附加列以供 Active Record 使用似乎很愚蠢。问题是,这些类型名称与 ruby​​ 类不完全匹配。我希望能够设置自定义映射,例如Class1 => foo,Class2 => bar。

我尝试了以下方法:

# In the base class
set_inheritance_column :provider

# In Class1
def self.sti_name
'foo'
end

# In Class2
def self.sti_name
'bar'
end

但这似乎并没有解决它,我得到:

The single-table inheritance mechanism failed to locate the subclass: 'foo'
...
activerecord (3.0.8) lib/active_record/base.rb:923:in `find_sti_class'

看起来 ActiveRecord 只能处理完整的类名和解模块化的类名。我完全不确定拥有 protected sti_name 方法的目的是什么。

我将深入研究框架并覆盖 ActiveRecord::Base.compute_type。在我这样做之前,有没有人这样做过?这是徒劳的追逐吗?

Rails 可以处理自定义类型名称吗?还是我只能使用 Ruby 类名称?

更新

我得到了这个用于:

# In the base class
def self.find_sti_class(type_name)
# Do mapping from foo/bar to Class1/Class2
...
end

我仍然担心 future 会遇到更多问题。这是执行此操作的正确方法吗?

最佳答案

查看 AR 代码,只关注 sti_nameinstantiate.. 看来你对这两个方法进行猴子修补就足够了。

我没有这方面的经验,但它看起来并不复杂。以下是实例化的样子:

def instantiate(record)
model = find_sti_class(record[inheritance_column]).allocate
model.init_with('attributes' => record)
model
end

理想情况下,您希望扫描代码以查找任何引用类似 record[inheritance_column] 或只是简单的 inheritance_column 的内容,并在其中注入(inject)您自己的映射代码。快速浏览一下,似乎在很多地方都没有使用它。

我会说你正在尝试的是可能的 :),但你将需要用于基本实例化的测试用例 + 涉及关联的东西,以确保 AR 可以为不同的情况找到并构建正确的 SQL。

很明显,虽然 AR 并不是按照您的想法构建的,因为代码中 inheritance_column 的使用并未在任何地方明确抽象出来。因此,这就是为什么您需要多检查一下代码。

关于ruby-on-rails - ActiveRecord 自定义类型命名方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6865920/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com