gpt4 book ai didi

ruby-on-rails-3 - 在 Rails 的 ActiveRecord 对象中跟踪未持久属性的脏

转载 作者:行者123 更新时间:2023-12-03 10:23:59 26 4
gpt4 key购买 nike

我有一个从 ActiveRecord 继承的对象,但它有一个未保存在数据库中的属性,例如:

 class Foo < ActiveRecord::Base
attr_accessor :bar
end

我希望能够使用 ActiveModel Dirty 提供的“bar_changed?”等方法跟踪对“bar”的更改。问题是当我尝试在这个对象上实现 Dirty 时,如 docs 中所述。 ,我收到一个错误,因为 ActiveRecord 和 ActiveModel 都定义了 define_attribute_methods ,但参数数量不同,因此在尝试调用 define_attribute_methods [:bar] 时出现错误.

我试过别名 define_attribute_methods在包括 ActiveModel::Dirty 之前,但没有运气:我得到一个未定义的方法错误。

关于如何处理这个问题的任何想法?当然,我可以手动编写所需的方法,但我想知道是否可以通过将 ActiveModel 功能扩展到 ActiveRecord 未处理的属性来使用 Rails 模块。

最佳答案

ActiveRecord#attribute方法( source )一旦从你的类中调用,就会让 ActiveModel::Dirty创建方法,例如 bar_was , bar_changed? , 和 many others .

因此,您必须调用 attribute :bar在从 ActiveRecord 扩展的任何类中(或 ApplicationRecord 对于最新版本的 Rails),以便在 bar 上创建这些辅助方法.

编辑:请注意,此方法不应与 attr_accessor :bar 混合使用

编辑 2:另一个注意事项是使用 attribute 定义的未持久属性(例如 attribute :bar, :string )将在保存时被吹走。如果您需要 attrs 在保存后闲逛(就像我一样),您实际上可以(小心地)与 attr_reader 混合使用,像这样:

attr_reader :bar
attribute :bar, :string

def bar=(val)
super
@bar = val
end

关于ruby-on-rails-3 - 在 Rails 的 ActiveRecord 对象中跟踪未持久属性的脏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5666745/

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