2010-12-16 15 views
6

Yalnızca bir has_many ile ilgili bir sorunla karşılaştınız: ilişkilendirme ve sonrasında/sonradan yok etme geri aramaları tetiklenmiyor.HMT collection_singular_ids = birleştirme modellerinin silinmesi doğrudan, geri çağırmaların tetiklenmesi yok

Diyelim ki, kullanıcılar, gruplar ve üyelik adı verilen bir ara ilişki var. Kullanıcıların, ilişkili onay kutularını işaretlediklerinde yeni bir üyelik kaydı oluşturarak gruplara kaydolmasına izin veren bir formum var. Temel olarak bir grup group_ids.

böyle bir şey görünüyor:

Which group would you like to join? (check all that apply) 
[] Group A 
[] Group B 
[] Group C 

Ve diğer bazı daha az önemli thigns böyle bir grup katılarak veya etkinlik günlüğü tabloya bir ayrılan grup olarak işlemleri kaydedebilir ve bunu istiyoruz.

Ben tanımlanan aşağıdaki adres: beklendiği gibi yeni bir üyelik kayıt after_create oluşturulur

class Group < AR::Base 
    has_many :memberships 
    has_many :users, :through => :memberships 
end 

class Membership < AR::Base 
    belongs_to :user 
    belongs_to :group 

    after_create :log_event_to_audit_table 
    after_destroy :log_event_to_audit_table 

end 

class User < ActiveRecord::Base 
    has_many :memberships 
    has_many :groups, :through => :memberships 

    attr_accessible :group_ids # enables mass-assignment 
end 

çalıştırılır. Ancak, after_destroy tetiklenmez!

google-ing ve ben nedenini keşfetti dokümanlar okumak sonra:

"modellerini katılmak otomatik olarak silme direkt , hiçbir zarar geri aramaları tetiklenir" - Ruby Kılavuzlarımızdan.

Hmmmmmm

...

Yani katılmak modeli en (bu durumda Üyelik en) geri aramaları tetiklenir edilmiyor yok. Peki bu bir düşüş. Neden olduğuna dair bir sebep var mı?

Sorularım bu soruna geçici bir çözüm bulmak için en iyi yol nedir? Üyelik hesabımın üyeliğini doğrudan additmek için kendi üyelerim/methodumu tanımlamalı mıyım?

Böyle bir senaryodaki en iyi uygulamalarla ilgili önerilere açık.

Teşekkürler! ,

before_add, after_add, before_remove ve

class User < ActiveRecord::Base 
    has_many :groups, :through => :memberships, :after_remove => :your_custom_method 
end 

after_remove aldım kaç tepkiler bakılırsa: dikkatle inceleyen API docs sonra

cevap

9

, Has_many ve habtm sadece bu durum için birkaç seçenek vardır çıkıyor Bu çok iyi belgelenmiş/kullanılmış bir özellik olmamalıdır.

Sadece kendim ve yaptığım gibi tökezleyen diğerleri için burada dikkat ediyorum.

+0

Bu delilik ... sana çok teşekkürler.Çok uzun zamandır bununla uğraşıyordum. –

+0

Bunu yapmak için Rails yolu gibi görünüyor. Yine de, “grup” un kaldırılmasının ardından tetiklenen eylemin * üyeliğin “üyesi” modelinin bir parçası olması gerektiğini düşünüyorum çünkü bir “grubun” kullanıcı tarafından kaldırılması aslında bir “üyeliğin” kaldırılmasıdır. Çok kötü, Raylar, kirli çözümler olmadan buna izin vermiyor. –

-1

Geçenlerde aynı sorunu ile mücadele ve silme yöntemi dernek uzanan ve geçersiz kılarak bunu çözdük: biz sadece güvenilir bağlı olamaz gibi bir yan not olarak

class User < ActiveRecord::Base 
    has_many :memberships 
    has_many :groups, :through => :memberships do 
    def delete(*args) 
     groups = args.flatten 
     # destroy memberships in order to trigger their callbacks: 
     proxy_association.owner.memberships.where(group_id: groups).destroy_all 
     super 
    end 
    end 
    ... 
end 

, görünüşe Rails model geri dönüşler, hangi tür bir hayal kırıklığı yaratıyor.

İlgili konular