2012-03-09 43 views
12

Tôi có thiết lập đơn giản là UserUserProfile mô hình với Người dùng has_one :user_profile và UserProfile belongs_to :user.Đường ray - chuỗi thực hiện sau khi tạo gọi lại & thuộc tính lồng nhau

Nhưng tôi không thể xoay đầu quanh cách Rails xác định thứ tự thực hiện của after_create gọi lại và accepts_nested_attributes_for được xác định trong mô hình của tôi. Hãy xem xét hai trường hợp này.

Trường hợp 1:

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

Bây giờ, nếu tôi có thể tạo một người dùng (với user_profile_attributes băm quá) thông qua giao diện điều khiển, gọi lại after_create được kích hoạt sau khi người sử dụng và hồ sơ người dùng của nó được tạo ra.

Trường hợp 2: Nếu after_create được đặt ở phía trên,

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

callback được kích hoạt sau khi người dùng đã được tạo ra nhưng trước khi tạo hồ sơ người dùng.

Đây có phải là cách nó được mong đợi hoạt động hay không. Rails làm gì trong nội bộ ở đây? Trình tự thực hiện có được xác định theo thứ tự mã không?

Tôi bắt đầu tìm hiểu sâu hơn hoặc gỡ lỗi vấn đề này ở đâu?

+1

Tôi sẽ kiểm tra lại điều này, thứ tự mã dưới dạng gọi lại không liên quan gì đến thứ tự thực hiện .. – Rabbott

+0

@Rabbott - Tôi đánh giá cao! – prasvin

+0

Sử dụng 'inverse_of' có thể hữu ích để giải quyết các phụ thuộc và lưu các vấn đề khi tạo hoặc lưu. ví dụ. 'has_one: user_profile, inverse_of:: user' – ybart

Trả lời

10

Thứ tự của các khai báo trong mô hình của bạn có thể có tác động đến thứ tự thực thi của mã. Đây là một nguồn cho những điều kỳ lạ khác nhau. (ví dụ: các định nghĩa gọi lại hiện tại và các liên kết has_and_belongs_to_many phụ thuộc vào đơn đặt hàng: https://github.com/rails/rails/pull/8674)

Để gỡ lỗi vấn đề bạn cần để duyệt nguồn đường ray. Kể từ khi vấn đề của bạn đã làm với trật tự thực hiện, callbacks và các thuộc tính lồng nhau Tôi sẽ bắt đầu bằng cách đọc lên trên:

này cung cấp cho bạn nền tảng cần thiết để đào sâu hơn. Bạn sẽ nhận thấy rằng các cuộc gọi accepts_nested_attributes_for vào add_autosave_association_callbackshttps://github.com/rails/rails/blob/master/activerecord/lib/active_record/autosave_association.rb#L173 Phương thức này thêm một cuộc gọi lại after_create và theo như tôi biết gọi lại được thực hiện theo thứ tự định nghĩa.

+2

Cảm ơn bạn. Đây chính xác là những gì tôi đang gặp phải. Mô hình của tôi đã thực hiện callbacks after_create và chúng được đặt TRƯỚC các định nghĩa has_many. Trong after_create tôi đã cập nhật một thuộc tính với update_attribute (trong một số trường hợp) mà sau đó đã gây ra phần còn lại của chuỗi has_many để không cập nhật ý nghĩa rằng has_many của tôi: thông qua các mối quan hệ KHÔNG tiết kiệm được gì. Di chuyển after_create SAU các định nghĩa mối quan hệ của tôi đã khắc phục vấn đề. Khùng. Cảm ơn bạn!!! –

+0

Vấn đề (không quá mơ hồ?) Được thảo luận trong bài đăng này là một điều.Tôi đã bị cắn bởi nó, và tôi đã khắc phục vấn đề bằng cách di chuyển định nghĩa gọi lại 'after_update' bên dưới các định nghĩa has_many & accepted_nested_attributes_for, trong mô hình của tôi - như được mô tả ở trên. –

+0

@DonnFelker có, di chuyển 'after_create' của tôi bên dưới' accept_nested_attributes' của tôi đã sửa nó cho tôi, cảm ơn. – eggie5

Các vấn đề liên quan