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