ActiveRecord modelinde bir alıcı yönteminin üzerine nasıl yazabilirim?


99

ActiveRecord modeli için bir alıcı yönteminin üzerine yazmaya çalışıyorum. nameModelde adında bir özelliğim var Categoryve bunun gibi bir şey yapabilmek istiyorum:

def name
  name_trans || name
end

Eğer name_transnitelik nil değil, o zaman, başka dönüş iade nameniteliği. Bunu nasıl yaparım?

Bu daha sonra normal olarak şu şekilde çağrılmalıdır:

@category.name

Yanıtlar:



98

Güncelleme: Rails Stil Kılavuzuna göre tercih edilen yöntem self[:name], read_attributeve yerine kullanmaktır write_attribute. Cevabımı atlayıp yerine tercih etmenizi öneririm bu bir .


Bunu aynen böyle yapabilirsiniz, ancak read_attributename özniteliğinin değerini gerçekten almak ve nameyönteme yapılan özyinelemeli çağrıyı önlemek için kullanmanız gerekmesi dışında :

def name 
  name_trans || read_attribute(:name)
end

2
Rubocop'un neden tercih ettiği hakkında bir fikriniz self[:name]var read_attribute[:name]mı?
Zack Xu

18

Alıcı yönteminin üzerine yazmak için başka bir seçenek eklemek istiyorum, bu sadece : süper.

def name
  name_trans || super
end

bu sadece öznitelikler alıcı yönteminde değil, aynı zamanda ilişkilendirme alıcı yöntemlerinde de çalışır , çok。


1
Rails kılavuzlarının şu anda alıcılar VE ayarlayıcılar için önerdiği şey budur: api.rubyonrails.org/classes/ActiveRecord/…
sandre89

5

Alıcıyı geçersiz kılmak ve kullanmak read_attributeilişkilendirmeler için işe yaramaz, ancak alias_method_chainbunun yerine kullanabilirsiniz .

def name_with_override
  name_trans || name_without_override
end

alias_method_chain :name, :override

Uygun bir örnek verebilir misiniz ...?
Arup Rakshit

İyi. Az önce doco'yu gördüm . Şimdi name, model nesnesini çağırırsam , hangisi çağrılacak - name_with_overrideveya name_without_override?
Arup Rakshit

1
nameşimdi arayacak name_with_override. Orijinal yöntemi herhangi bir nedenle aramak istiyorsanız, arayabilirsiniz name_without_override.
Patrick Oscity

OI bak .. Cevaplarınız için teşekkürler //
Arup Rakshit

2

Bunun gibi mağaza özelliklerini kullanıyorsanız

store :settings, accessors: [:volume_adjustment] 

veya mücevher bağlantısı gibi taşlar kullanarak hstore_accessor

Dolayısıyla store, modelde yöntemi kullanmayı bitirdiniz, sonra kullanamayacağınız bu yöntemi geçersiz kılmak self.read_attributeiçin bunun yerine şu şekilde kullanmanız gerekir super:

def partner_percentage
  super.to_i || 10
end

0

name_transAlıcı yönteminden sonra değeri güncellemek isteyen biri self [: name] = kullanabilirsiniz.

def name
  self[:name] = name_trans || self[:name]
  # don't do this, it will cause endless loop
  # update(name: name_trans)
end

0

Rails read_attribute yöntemini kullanabilirsiniz. Rails belgeleri


Bu bağlantı soruyu yanıtlayabilir, ancak SO'da yalnızca yanıtlara izin verilmez, lütfen yanıtınıza bu bağlantının arkasından biraz bağlam ekleyin. Teşekkürler! :)
AJT82
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.