我想覆盖/扩展 Railshas_one
关联方法,以便它始终返回关联类的实例。(如果数据库中不存在,我想创建一个新的并将其分配给父实例。)
理想情况下,我想通过内置的 Rails 关联扩展机制来做到这一点。但是,我不知道“getter”方法的名称,所以我不知道要覆盖什么。
如何覆盖关联 getter,以便在它为 nil 时实例化一个新对象?
我想覆盖/扩展 Railshas_one
关联方法,以便它始终返回关联类的实例。(如果数据库中不存在,我想创建一个新的并将其分配给父实例。)
理想情况下,我想通过内置的 Rails 关联扩展机制来做到这一点。但是,我不知道“getter”方法的名称,所以我不知道要覆盖什么。
如何覆盖关联 getter,以便在它为 nil 时实例化一个新对象?
从 Rails 3 开始, alias_method 不是覆盖关联方法的首选方式。引用文档:
覆盖生成的方法
关联方法是在包含在模型类中的模块中生成的,它允许您轻松地用自己的方法覆盖并使用 super 调用原始生成的方法。例如:
class Car < ActiveRecord::Base belongs_to :owner belongs_to :old_owner def owner=(new_owner) self.old_owner = self.owner super end end
如果您的模型类是 Project,则该模块名为 Project::GeneratedFeatureMethods。GeneratedFeatureMethods 模块在(匿名)生成的属性方法模块之后立即包含在模型类中,这意味着关联将覆盖具有相同名称的属性的方法。
您可以为原始方法设置别名,然后定义一个具有相同名称的新方法。
例如:
class MyModel < ActiveRecord::Base
has_one :associated_model
alias :old_associated_model :associated_model
def associated_model
old_associated_model || AssociatedModel.new(my_model_id: id)
end
end
我不知道这是否是处理这种情况的规范方法,但它应该有效。