2012-03-09 19 views
12

oluşturmak yürütülmesi dizisi I Kullanıcı has_one :user_profile ve Kullanıcıprofili belongs_to :user ile User ve UserProfile modelinin basit bir kurulum ile var.Raylar - sonra geri arama ve iç içe özelliklerini

Ancak, raylarım, modelimde tanımlanan after_create geri arama ve accepts_nested_attributes_for yürütme sırasını nasıl tanımladığı konusunda kafamı kapatamıyorum. Bu iki vakayı ele alalım.

Durum 1: Ben konsolu üzerinden (user_profile_attributes çok karma ile birlikte) bir kullanıcı oluşturursanız Şimdi

class User < ActiveRecord::Base 
    has_one :user_profile 
    accepts_nested_attributes_for :user_profile 
    after_create :test_test 
end 

, after_create geri arama kullanıcıya sonra tetiklenir ve kullanıcı profili oluşturulur.

Durum 2: after_create

class User < ActiveRecord::Base 
    after_create :test_test 
    has_one :user_profile 
    accepts_nested_attributes_for :user_profile 
end 

geri arama, bir kullanıcı oluşturulduktan sonra tetiklenen ancak bir kullanıcı profili oluşturmadan önce edilir tepesinde yer almaktadır edin.

o işlevi görecek bu şekilde mi. Rails dahili olarak burada ne yapıyor? Uygulama sırası, kod sırasına göre belirlenir mi?

nereden bu işe veya hata ayıklama derin kazmak başlar?

+1

yine bu test olacağını, geri aramaları şeklinde kod sırası yürütme amacıyla .. – Rabbott

+0

@Rabbott ile ilgisi yoktur! – prasvin

+0

'inverse_of' işlevinin kullanılması, bağımlılıkları çözmek ve kaydetme veya kaydetme ile ilgili sorunları kaydetmede yararlı olabilir. Örneğin. has_one: user_profile, inverse_of:: kullanıcı ' – ybart

cevap

10

kod yürütme sipariş üzerine bir etkisi olabilir Modelinizdeki beyanlarına sırası. Bu çeşitli garip şeyler için bir kaynaktır. (örneğin, şu anda geri arama tanımları ve has_and_belongs_to_many ilişkilendirmeleri sırasıyla düzenlenmiştir: https://github.com/rails/rails/pull/8674)

Sorunun hatalarını ayıklamak için kaynaklara göz atmanız gerekir. Sorununuz üzerinde okuyarak yürütme amacıyla, geri aramaları ve iç içe nitelikler ben başlayacağı ile ilgisi olduğundan:

Bu sayede gerekli arka plan verir daha derin kaz. Bu yöntem after_create geri arama ekler ve bildiğim kadarıyla geri aramalar bildiği gibi tanım sırasına göre yürütülür add_autosave_association_callbackshttps://github.com/rails/rails/blob/master/activerecord/lib/active_record/autosave_association.rb#L173 içine accepts_nested_attributes_for aramaları göreceksiniz. Ben takdir -

+2

Teşekkür ederiz. Bu tam da benim içine girdiğim şeydi. Modelim sonradan çalışan geri çağrıları çalıştı ve bunlar has_many tanımlarından ÖNCE yerleştirildi. ilişkiler yoluyla olursa olsun tasarruf DEĞİL edildi: after_create ben o zaman benim Has_many bu anlam güncellenmesi başarısız olmasına Has_many zincirinin geri kalanı neden oldu (bazı durumlarda) update_attribute bir özelliği güncellenirken edildi. After_create SONRASI İlişki tanımlarımdan sonra sorunu çözdüm. Çılgın. Teşekkür ederim!!! –

+0

Bu yayında tartışılan (çok karanlık olmayan) bir konu bir şeydir.Bunun tarafından ısırılmıştım ve problemi, 'after_update' geri çağırma tanımını yukarıda açıklandığı gibi, modelimdeki has_many & accepts_nested_attributes_for tanımlarının altına getirerek düzelttim. –

+0

@DonnFelker evet, 'after_create'ımı benim' accepts_nested_attributes 'altındaki benim için de düzelt, teşekkürler. – eggie5