Saya mencoba untuk menimpa metode pengambil untuk model ActiveRecord. Saya memiliki atribut yang disebut name
model Category
, dan saya ingin dapat melakukan sesuatu seperti ini:
def name
name_trans || name
end
Jika name_trans
atribut bukan nil, maka kembalikan, jika tidak name
atribut kembalikan . Bagaimana saya melakukan ini?
Ini kemudian harus dipanggil secara normal seperti ini:
@category.name
ruby-on-rails
ruby
rails-activerecord
getter-setter
oyvindhauge.dll
sumber
sumber
Update: Metode yang disukai sesuai dengan Rails Style Guide adalah dengan menggunakan
self[:name]
bukannyaread_attribute
danwrite_attribute
. Saya akan mendorong Anda untuk melewatkan jawaban saya dan lebih memilih yang ini .Anda dapat melakukannya persis seperti itu, kecuali yang perlu Anda gunakan
read_attribute
untuk benar-benar mengambil nilai atribut name dan menghindari panggilan rekursif kename
metode:sumber
self[:name]
lebihread_attribute[:name]
?Saya ingin menambahkan opsi lain untuk menimpa metode pengambil, yaitu : super.
ini berfungsi tidak hanya pada metode pengambil atribut, tetapi juga metode pengambil asosiasi, juga。
sumber
Mengganti pengambil dan menggunakan
read_attribute
tidak berfungsi untuk pengaitan, tetapi Anda dapat menggunakannyaalias_method_chain
.sumber
name
objek model, mana yang akan dipanggil -name_with_override
atauname_without_override
?name
sekarang akan meneleponname_with_override
. Jika Anda ingin memanggil metode asli karena suatu alasan, Anda dapat meneleponname_without_override
.Jika Anda menggunakan atribut toko seperti ini
atau menggunakan permata seperti
hstore_accessor
tautan permataJadi Anda akhirnya menggunakan
store
metode pada model, lalu untuk mengganti metode yang tidak dapat Anda gunakanself.read_attribute
, Anda harus menggunakan sebagai gantinyasuper
:sumber
Jika seseorang ingin memperbarui nilai setelah
name_trans
dalam metode pengambil, Anda dapat menggunakan self [: name] =.sumber
Anda dapat menggunakan metode Rails read_attribute. Dokumen Rails
sumber