Tôi có một ứng dụng mà người dùng của tôi có thể có một tập hợp các tùy chọn. Cả hai đều được lưu trữ như ActiveRecord-mô hình như sau:Đường ray: Tạo liên kết nếu không tìm thấy lỗi nào để tránh lỗi nil
class User < AR::Base
has_one :preference_set
end
class PreferenceSet < AR::Base
belongs_to :user
end
bây giờ tôi có thể truy cập vào sở thích của người dùng:
@u = User.first
@u.preference_set => #<PreferenceSet...>
@u.preference_set.play_sounds => true
Nhưng điều này không nếu một bộ sở thích chưa được tạo ra, kể từ khi @u. preferences_set sẽ trả về 0 và tôi sẽ gọi số play_sounds
trên nil
.
Điều tôi muốn lưu trữ là User.preference_set luôn trả về một thể hiện PreferenceSet. Tôi đã thử xác định nó như thế này:
class User < ..
has_one :preference_set
def preference_set
preference_set || build_preference_set
end
end
Điều này gây ra một 'Stack level too deep'
, vì nó đang tự gọi mình đệ quy.
Câu hỏi của tôi là thế này:
Làm thế nào tôi có thể đảm bảo rằng @user.preference_set
lợi nhuận hoặc là preference_set kỷ lục tương ứng hoặc, nếu không tồn tại, xây dựng một cái mới?
Tôi biết tôi có thể đổi tên liên kết của mình (ví dụ: preference_set_real
) và tránh các cuộc gọi đệ quy theo cách này, nhưng vì mục đích đơn giản trong ứng dụng của tôi, tôi muốn giữ tên.
Cảm ơn!
Wow, đã không đi qua alias_method_chain. Thật tuyệt. – Chowlett
Hãy thông báo rằng 'alias_method_chain' đã không được hỗ trợ cho' Module # prepend'. Thông tin thêm tại đây: https://github.com/rails/rails/pull/19434 –