Gerçekten istiyorsanız, bir denetleyicideki bir işlemi kullanabilirsiniz. Belirttiğiniz gibi, bu kötü bir uygulamadır, ancak bunu yapmak istiyorsanız, transaction do
yerine Product.transaction do
'u arayın. transaction
, ActiveRecord::Base
üzerinde bir sınıf yöntemidir, bu nedenle ActiveRecord türetilmiş bir sınıfta çağırmanız gerekir. Uygulamanızdaki herhangi bir model sınıfı (nit-picking caveat: farklı modeller için farklı veritabanlarına bağlanıyorsanız, bu doğru olmayabilir ... ama muhtemelen bunu yapmıyorsanız) yapacağız. Bu kötü bir uygulama olmasının sebebi, kaygıları MVC paradigmasına göre doğru şekilde ayırmamasıdır. Denetleyiciniz, veri kalıcılığı uygulamanızla o kadar ilgilenmemelidir. Daha iyi bir yaklaşım, Product
'a bir yöntem eklemek olacaktır. Böyle Belki bir şey: yerine denetleyici içinde product.save
çağıran
def save_and_update_create_time
transaction do
if save
client.update_attribute(:product_create, Time.now)
end
end
end
Sonra product.save_and_update_client_create_time
diyoruz. Bu yönteme de client
kodunu iletmeniz gerekebilir; client
'un nereden geldiği kodunuzdan net değil. product
'daki bir özellikse, yukarıdaki yöntem çalışmalıdır.
Ayrıca, bir product
client
herhangi bir denetleyici verisine gerek kalmadan bilirse, bunu yapmak için daha iyi, daha Railsy yolları vardır.
after_save :update_client
private
def update_client(product)
product.client.update_attribute(:product_create, Time.now)
end
Sonra
Product
kaydedilir her zaman, ilgili istemcide alan güncellenecektir: O zaman sadece bu gibi (
Product
sınıfa ekleyin), bir
after_save
geri arama kullanabilirsiniz. İlk önce bir
client
varlığını kontrol etmek için bir kod eklemeniz gerekecek.
Temiz kodun yanı sıra geri çağrıları kullanmanın yararı, geri dönüşüm zincirinin tamamının kaydetme ile birlikte tek bir işlemde çalıştığıdır; işlemi manuel olarak oluşturmanız gerekmez. Rails documentation numaralı telefondan geri arama hakkında daha fazla bilgi edinebilirsiniz.
Çok teşekkürler Jim, bana açıklamalarınızda yardımcı oluyorsunuz! – user1364684
Eğer işlem mantığı bir Modele sokulursa, işlemler ayrı bir model kuralını ihlal etmemek için bir Model ile sınırlı olmaz mı? Genellikle, işlemlerin, DB düzeyinde birbiriyle ilintili olmayan birden fazla Model arasında geniş bir şansı vardır. – xSNRG
Evet, yorumumun bu özel yönü üzerinde bir kalp değişikliği yaşadım. Denetleyiciden uzak tutmayı sevdim ama çok modelli etkileşimler bir yere sarılmalıdır.Belki başka bir sınıf, ancak bazı durumlarda kontrolör her şeyden sonra doğru yer olabilir. –