Итак, я знаю, как переопределить получатели по умолчанию для атрибутов объекта ActiveRecord, используя
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
возвращал последнюю строку, а не nil, если эта связь еще не существует.
Однако это не работает. Причина в том, что self [: bar] всегда undefined. Это на самом деле self [: bar_id].
Я могу сделать что-то наивное, как:
def bar
if self[:bar_id]
return Bar.find(self[:bar_id])
else
return Bar.last
end
end
Однако это всегда вызовет вызов db, даже если Bar уже был извлечен, что, безусловно, не идеально.
Есть ли у кого-нибудь представление о том, как я могу иметь отношения, так что атрибут belongs_to загружается только один раз и имеет значение по умолчанию, если оно не установлено.