如何覆盖Rails has_one关联的getter方法?

Cra*_*ker 6 ruby-on-rails associations has-one ruby-on-rails-3

我想覆盖/扩展Rails has_one关联方法,以便它始终返回关联类的实例.(如果数据库中不存在,我想创建一个新的并将其分配给父实例.)

理想情况下,我想通过内置的Rails关联扩展机制来实现这一点.但是,我不知道"getter"方法的名称,因此我不知道要覆盖什么.

如何覆盖关联getter,以便我可以在nil时实例化一个新对象?

Mic*_*ton 13

从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
Run Code Online (Sandbox Code Playgroud)

如果您的模型类是Project,则该模块名为Project :: GeneratedFeatureMethods.GeneratedFeatureMethods模块在(匿名)生成的属性方法模块之后立即包含在模型类中,这意味着关联将覆盖具有相同名称的属性的方法.


Zac*_*emp 9

您可以为原始方法添加别名,然后定义具有相同名称的新方法.

例如:

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
Run Code Online (Sandbox Code Playgroud)

我不知道这是否是处理这种情况的规范方法,但它应该有效.