所以我知道如何使用覆盖 ActiveRecord 对象属性的默认 getter
def custom_getter
return self[:custom_getter] || some_default_value
end
我正在努力实现同样的目标,但是对于属于协会。例如。
class Foo < AR
belongs_to :bar
def bar
return self[:bar] || Bar.last
end
end
class Bar < AR
has_one :foo
end
当我说:
f = Foo.last
我想让方法 f.bar
返回最后一个 Bar,而不是 nil(如果该关联尚不存在)。
但这不起作用。原因是 self[:bar] 始终是未定义的。它实际上是 self[:bar_id]。
我可以做一些天真的事情,比如:
def bar
if self[:bar_id]
return Bar.find(self[:bar_id])
else
return Bar.last
end
end
但是,即使已经获取了 Bar,这也总是会进行数据库调用,这当然不理想。
有谁知道我如何建立一种关系,使得belongs_to属性仅加载一次,并且如果未设置则具有默认值。
最佳答案
alias_method 是你的 friend 。
alias_method :original_bar, :bar
def bar
self.original_bar || Bar.last
end
其工作方式是将默认的“bar”方法别名为“original bar”,然后实现您自己的“bar”版本。如果对original_bar的调用返回nil,那么您将返回最后一个Bar实例。
关于ruby-on-rails - Rails 覆盖关系的默认 getter (belongs_to),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2500775/