направляющие переопределяют метод считывания по умолчанию для отношений (belongs_to)

Таким образом, я знаю, как переопределить методы считывания по умолчанию для атрибутов использования объекта 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 только загружается однажды и имеет значение по умолчанию, если не устанавливает.

47
задан brad 23 March 2010 в 14:44
поделиться

1 ответ

alias_method - ваш друг.

alias_method :original_bar, :bar
def bar
  self.original_bar || Bar.last
end

Это работает следующим образом: вы назначаете метод «bar» по умолчанию как «исходный bar», а затем реализуете свою собственную версию «bar». Если вызов original_bar возвращает nil, вместо этого вы возвращаете последний экземпляр Bar.

71
ответ дан 26 November 2019 в 19:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: