Próbuję nadpisać metodę pobierającą dla modelu ActiveRecord. Mam atrybut o nazwie name
w modelu Category
i chciałbym móc zrobić coś takiego:
def name
name_trans || name
end
Jeśli name_trans
atrybut nie jest nil, zwróć go, w przeciwnym razie zwróć name
atrybut. Jak bym to zrobił?
Należy to wtedy nazwać normalnie w ten sposób:
@category.name
ruby-on-rails
ruby
rails-activerecord
getter-setter
oyvindhauge
źródło
źródło
Aktualizacja: Preferowaną metodą według Przewodnika po stylach Rails jest użycie
self[:name]
zamiastread_attribute
iwrite_attribute
. Zachęcam do pominięcia mojej odpowiedzi i zamiast tego wolę tę .Możesz to zrobić dokładnie w ten sposób, z tym wyjątkiem, że musisz użyć,
read_attribute
aby faktycznie pobrać wartość atrybutu name i uniknąć rekurencyjnego wywołanianame
metody:źródło
self[:name]
więcejread_attribute[:name]
?Chciałbym dodać kolejną opcję nadpisywania metody gettera, która jest po prostu super.
działa to nie tylko na metodzie pobierającej atrybuty, ale także na metodach pobierających asocjacje , także。
źródło
Zastępowanie metody pobierającej i używanie
read_attribute
nie działa w przypadku skojarzeń, alealias_method_chain
zamiast tego można użyć .źródło
name
wywołam obiekt modelu, który zostanie wywołany -name_with_override
czyname_without_override
?name
teraz zadzwoniname_with_override
. Jeśli z jakiegoś powodu chcesz wywołać oryginalną metodę, możesz wywołaćname_without_override
.Jeśli używasz atrybutów sklepu, takich jak ten
lub używając klejnotów, takich jak link do klejnotów
hstore_accessor
Skończyło się na użyciu
store
metody na modelu, a następnie, aby zastąpić metodę, której nie możesz użyćself.read_attribute
, musisz zamiast tego użyćsuper
:źródło
Jeśli ktoś chce zaktualizować wartość after
name_trans
w metodzie getter, możesz użyć self [: name] =.źródło
Możesz użyć metody read_attribute Railsów. Dokumenty Rails
źródło