Trong đường ray, khi lưu đối tượng active_record, các đối tượng liên quan của nó cũng sẽ được lưu. Nhưng has_one và has_many hiệp hội có thứ tự khác nhau trong việc lưu các đối tượng.Lưu một bản ghi hoạt động, theo thứ tự các đối tượng liên kết được lưu là gì?
Tôi có ba mô hình đơn giản:
class Team < ActiveRecord::Base
has_many :players
has_one :coach
end
class Player < ActiveRecord::Base
belongs_to :team
validates_presence_of :team_id
end
class Coach < ActiveRecord::Base
belongs_to :team
validates_presence_of :team_id
end
tôi mong đợi rằng khi team.save
được gọi, đội nên được lưu trước khi HLV và các cầu thủ liên quan của nó.
tôi sử dụng đoạn mã sau để kiểm tra các mô hình:
t = Team.new
team.coach = Coach.new
team.save!
team.save!
trả về true.
Nhưng trong thử nghiệm khác:
t = Team.new
team.players << Player.new
team.save!
team.save!
cung cấp cho các lỗi sau:
> ActiveRecord::RecordInvalid:
> Validation failed: Players is invalid
tôi đã tìm ra rằng team.save!
tiết kiệm đối tượng theo thứ tự sau: 1) người chơi, 2) đội bóng, và 3) huấn luyện viên. Đây là lý do tại sao tôi nhận được lỗi: Khi một người chơi được lưu, đội bóng chưa có id, do đó, validates_presence_of :team_id
không thành công trong trình phát.
Ai đó có thể giải thích cho tôi tại sao các đối tượng được lưu theo thứ tự này không? Điều này có vẻ không hợp lý với tôi.
Để làm cho vấn đề rõ ràng hơn: khi team.save! được gọi là, có thể để đối tượng nhóm được lưu vào cơ sở dữ liệu trước đối tượng trình phát không? – Shuo