Contoh dari apa yang saya bicarakan:
class Person < ActiveRecord::Base
def name=(name)
super(name.capitalize)
end
def name
super().downcase # not sure why you'd do this; this is just an example
end
end
Ini tampaknya berhasil, tetapi saya baru saja membaca bagian tentang mengganti metode atribut dalam ActiveRecord :: Base docs , dan itu menyarankan menggunakanread_attribute
write_attribute
metode dan . Saya pikir pasti ada yang salah dengan apa yang saya lakukan dalam contoh di atas; jika tidak, mengapa mereka memberkati metode ini sebagai "cara yang benar" untuk mengganti metode atribut? Mereka juga memaksakan idiom yang lebih buruk, jadi pasti ada alasan bagus ...
Pertanyaan saya yang sebenarnya: Apakah ada yang salah dengan contoh ini?
ruby-on-rails
oop
activerecord
Ajedi32
sumber
sumber
Sebagai ekstensi untuk jawaban Aaron Longwell, Anda juga dapat menggunakan "notasi hash" untuk mengakses atribut yang memiliki pengalih dan mutator yang diganti:
sumber
self.attribute
pukulan stack pada 3.2.16.||=
untuk gagal bayar:def name; self[:name] ||= 'anon'; end
Ada beberapa informasi hebat yang tersedia tentang topik ini di http://errtheblog.com/posts/18-accessor-missing .
Panjang dan pendeknya adalah bahwa ActiveRecord tidak benar menangani panggilan super untuk pengakses atribut ActiveRecord.
sumber
Saya memiliki plugin rails yang membuat atribut overriding berfungsi dengan super seperti yang Anda harapkan. Anda dapat menemukannya di github .
Untuk memasang:
Menggunakan:
Setelah Anda selesai melakukannya, semuanya bekerja:
sumber