我有一个Audit
由 ActiveRecord 支持的课程。
class Audit < ActiveRecord::Base
belongs_to :user, polymorphic: true
end
我有一个User
类,它是一个普通的 ruby 对象,包含一些 ActiveModel 功能。它不是数据库模型,因为我的用户实际上存储在不同的数据库中并通过 API 提供服务。
class User
include ActiveModel::Conversion
include ActiveModel::Validations
extend ActiveModel::Naming
def self.primary_key
'id'
end
def id
42
end
def persisted?
false
end
end
我正在尝试将用户分配给这样的审核:
audit = Audit.new
audit.user = User.new
audit.save!
从数据的角度来看,这应该可以。要定义多态关联,我们需要将值放入审计表的两列中。我们可以设置audits.user_id
为值42
和audits.user_type
字符串“用户”。
但是,我遇到了一个例外:
undefined method `_read_attribute' for #<User:0x007f85faa49520 @attributes={"id"=>42}> (NoMethodError)
active_record/associations/belongs_to_polymorphic_association.rb:13:in `replace_keys'
我追溯到ActiveRecord
源头,它似乎是在这里定义的。不幸的是,它ActiveRecord
不是而不是ActiveModel
意味着我不能将那个 mixin 包含在我的课程中。
我尝试定义自己的_read_attribute
方法,但我不得不重新定义越来越多的 ActiveRecord 功能,如AttributeSet等。
我也意识到我可以通过分配Audit#user_type
和来解决这个问题Audit#user_id
。然而,这并不令人满意,因为实际上,我必须分叉一个 gem 并对其进行编辑才能做到这一点。
如何修改我的用户类,以便我可以干净地将其分配给审计。
PS这是一个示例应用程序,因此您可以自己尝试。