Tôi đã nâng cấp lên Rails 2.3.3 (từ 2.1.x) và tôi đang cố gắng tìm ra phương thức accepts_nested_attributes_for
. Tôi có thể sử dụng phương thức để cập nhật các đối tượng lồng nhau hiện có, nhưng tôi không thể sử dụng nó để tạo các đối tượng lồng nhau mới. Với ví dụ contrived:Cách tạo đối tượng lồng nhau bằng cách sử dụng accept_nested_attributes_for
class Product < ActiveRecord::Base
has_many :notes
accepts_nested_attributes_for :notes
end
class Note < ActiveRecord::Base
belongs_to :product
validates_presence_of :product_id, :body
end
Nếu tôi cố gắng tạo ra một mới Product
, với một lồng nhau Note
, như sau:
params = {:name => 'Test', :notes_attributes => {'0' => {'body' => 'Body'}}}
p = Product.new(params)
p.save!
Nó không hợp lệ với thông điệp:
ActiveRecord::RecordInvalid: Validation failed: Notes product can't be blank
Tôi hiểu tại sao điều này xảy ra - đó là vì số validates_presence_of :product_id
trên lớp Note
và bởi vì tại thời điểm lưu bản ghi mới, 012 Đối tượngkhông có số id
. Tuy nhiên, tôi không muốn xóa xác thực này; Tôi nghĩ rằng nó sẽ là không chính xác để loại bỏ nó.
Tôi cũng có thể giải quyết vấn đề bằng cách tạo thủ công trước tiên Product
và sau đó thêm Note
, nhưng điều đó đánh bại sự đơn giản của accepts_nested_attributes_for
.
Có cách Rails chuẩn để tạo đối tượng lồng nhau trên bản ghi mới không?
Trong Rails 3 vấn đề này được giải quyết bằng cách thêm vào: inverse_of tùy chọn để has_many, has_one và belongs_to. Xem ví dụ http://www.daokaous.com/rails3.0.0_doc/classes/ActiveRecord/Associations/ClassMethods.html#M001988 trong phần "Liên kết hai chiều" –
Tôi đã chọn tắt tính năng xác thực khi: id == nil . Vì điều đó chỉ xảy ra khi viết một bản ghi mới, lồng nhau, tôi hy vọng rằng sẽ an toàn. Odd rằng vấn đề này đã làm cho nó tất cả các cách để 2.3.8. – aceofspades
inverse_of dường như không hoạt động khi cả cha lẫn mẹ của bản ghi không tồn tại, và do đó không có id nào có thể được kiểm tra. Hình như hack lồng nhau này là cách duy nhất thông qua. :( – DGM