Я пытаюсь перезаписать метод получения для модели ActiveRecord. У меня есть атрибут, вызываемый name
в модели Category
, и я хотел бы сделать что-то вроде этого:
def name
name_trans || name
end
Если name_trans
атрибут не равен нулю, вернуть его, иначе вернуть name
атрибут. Как бы я это сделал?
Затем это следует обычно вызывать следующим образом:
@category.name
ruby-on-rails
ruby
rails-activerecord
getter-setter
Oyvindhauge
источник
источник
Обновление: согласно Руководству по стилю Rails предпочтительным методом является использование
self[:name]
вместоread_attribute
иwrite_attribute
. Я бы посоветовал вам пропустить мой ответ и вместо этого предпочесть этот .Вы можете сделать это точно так же, за исключением того, что вам нужно использовать
read_attribute
для фактического получения значения атрибута name и избежать рекурсивного вызоваname
метода:источник
self[:name]
болееread_attribute[:name]
?Я хотел бы добавить еще один вариант перезаписи метода получения, который просто супер.
это работает не только с методом получения атрибутов, но и с методами получения ассоциаций , тоже。
источник
Переопределение получателя и использования
read_attribute
не работает для ассоциаций, но вы можете использоватьalias_method_chain
вместо этого.источник
name
объект модели, какой из них будет вызван -name_with_override
илиname_without_override
?name
сейчас буду звонитьname_with_override
. Если вы по какой-то причине хотите вызвать исходный метод, вы можете вызватьname_without_override
.Если вы используете такие атрибуты магазина
или используя драгоценные камни, такие как ссылка на драгоценный
hstore_accessor
каменьИтак, вы закончили использовать
store
метод в модели, а затем, чтобы переопределить тот метод, который вы не можете использоватьself.read_attribute
, вы должны использовать вместо этогоsuper
вот так:источник
Если кто-то хочет обновить значение после
name_trans
в методе получения, вы можете использовать self [: name] =.источник
Вы можете использовать метод read_attribute Rails. Документы по Rails
источник