gpt4 book ai didi

ruby-on-rails - ActiveRecord 通过针对 STI 类的范围构建错误类的实例

转载 作者:行者123 更新时间:2023-12-02 22:36:28 24 4
gpt4 key购买 nike

我希望能够在通过其 STI 类型以特定模型类为目标的作用域上调用 build 方法,并让 ActiveRecord 构建正确类的实例。

class LineItem < ActiveRecord::Base
scope :discount, where(type: 'DiscountLineItem')
end

class DiscountLineItem < LineItem; end

> LineItem.discount.build # Expect an instance of DiscountLineItem here
=> #<LineItem ...>

在这里,我期望的是 DiscountLineItem 的实例,而不是 LineItem 的实例。

最佳答案

即使 ActiveRecord 没有将对象实例化为正确的类,它确实正确地设置了类型。您基本上有两种解决方法:

1) 创建对象,然后从数据库重新加载:

item = LineItem.discount.create(attrs...)
item = LineItem.find(item.id)

2) 使用 STI 类并直接从它构建对象:

DiscountLineItem.build

鉴于 ActiveRecord 的所有功能,这似乎是一种毫无意义的限制,并且可能不太难更改。现在你激起了我的兴趣:)

更新:

这是最近 added to Rails 4.0使用以下提交消息:

Allows you to do BaseClass.new(:type => "SubClass") as well as parent.children.build(:type => "SubClass") or parent.build_child to initialize an STI subclass. Ensures that the class name is a valid class and that it is in the ancestors of the super class that the association is expecting.

关于ruby-on-rails - ActiveRecord 通过针对 STI 类的范围构建错误类的实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11387836/

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