Rails - Xác thực sự hiện diện của Hiệp hội?


107

Tôi có một mô hình A có liên kết "has_many" với một mô hình khác B. Tôi có một yêu cầu kinh doanh rằng việc chèn vào A yêu cầu ít nhất 1 bản ghi được liên kết với B. Có phương pháp nào tôi có thể gọi để đảm bảo điều này là đúng không, hay tôi cần viết xác nhận tùy chỉnh?

Câu trả lời:


167

Bạn có thể sử dụng validates_presence_of http://apidock.com/rails/ActiveModel/Validations/ClassMethods/validates_presence_of

class A < ActiveRecord::Base
  has_many :bs
  validates_presence_of :bs
end

hoặc chỉ validates http://apidock.com/rails/ActiveModel/Validations/ClassMethods/validates

class A < ActiveRecord::Base
  has_many :bs
  validates :bs, :presence => true
end

Nhưng có một lỗi với nó nếu bạn sẽ sử dụng accepts_nested_attributes_forvới :allow_destroy => true: Các mô hình lồng nhau và xác thực cha mẹ . Trong chủ đề này, bạn có thể tìm thấy giải pháp.


18

-------- Đường ray 4 ------------

Đơn giản validates presencelàm việc cho tôi

class Profile < ActiveRecord::Base
  belongs_to :user

  validates :user, presence: true
end

class User < ActiveRecord::Base
  has_one :profile
end

Bằng cách này, Profile.createbây giờ sẽ thất bại. Tôi phải sử dụng user.create_profilehoặc liên kết người dùng trước khi lưu a profile.


6

Bạn có thể xác thực các liên kết với validates_existence_of(là một plugin):

Đoạn mã mẫu từ mục blog này :

class Tagging < ActiveRecord::Base
  belongs_to :tag
  belongs_to :taggable, :polymorphic => true
  validates_existence_of :tag, :taggable

  belongs_to :user
  validates_existence_of :user, :allow_nil => true
end

Ngoài ra, bạn có thể sử dụng validates_associated. Như Faisal lưu ý trong phần nhận xét bên dưới câu trả lời, hãy validates_associatedkiểm tra xem đối tượng được liên kết có hợp lệ hay không bằng cách chạy các xác thực lớp liên quan. Nó không kiểm tra sự hiện diện. Điều quan trọng cần lưu ý là một liên kết nil được coi là hợp lệ.


4

Nếu bạn muốn đảm bảo rằng liên kết có mặt và được đảm bảo hợp lệ, bạn cũng cần sử dụng

class Transaction < ActiveRecord::Base
  belongs_to :bank

  validates_associated :bank
  validates :bank, presence: true
end

Thật tuyệt nếu bạn có thể vượt qua một tùy chọn bổ sung để validatesthích valid: truethay vì phải gọi validates_associatedriêng.
Joshua Pinter
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.