Estou tentando substituir um método getter para um modelo ActiveRecord. Tenho um atributo chamado name
no modelo Category
e gostaria de poder fazer algo assim:
def name
name_trans || name
end
Se o name_trans
atributo não for nulo, retorne-o, caso contrário, retorne o name
atributo. Como eu faria isso?
Em seguida, deve ser chamado normalmente assim:
@category.name
ruby-on-rails
ruby
rails-activerecord
getter-setter
Oyvindhauge
fonte
fonte
Update: O método preferido de acordo com o Rails Style Guide é usar ao
self[:name]
invés deread_attribute
ewrite_attribute
. Eu o encorajaria a pular minha resposta e preferir esta .Você pode fazer exatamente assim, exceto que você precisa usar
read_attribute
para realmente buscar o valor do atributo name e evitar a chamada recursiva para oname
método:fonte
self[:name]
maisread_attribute[:name]
?Eu gostaria de adicionar outra opção para sobrescrever o método getter, que é simplesmente: super.
isso funciona não apenas no método getter de atributos, mas também nos métodos getter de associações。
fonte
Substituir o getter e usar
read_attribute
não funciona para associações, mas você pode usaralias_method_chain
.fonte
name
o objeto de modelo, qual será chamado -name_with_override
ouname_without_override
?name
agora vai ligarname_with_override
. Se você deseja chamar o método original por algum motivo, você pode chamarname_without_override
.Se você usar atributos de loja como este
ou usando gemas como
hstore_accessor
link de gemaEntão você acabou usando o
store
método no modelo, então para substituir aqueles métodos que você não pode usarself.read_attribute
, você deve usarsuper
assim:fonte
Se alguém quiser atualizar o valor após o
name_trans
método getter, você pode usar self [: name] =.fonte
Você pode usar o método read_attribute do Rails. Rails docs
fonte