Tôi có một Releasemô hình với mediumvà countrycột (trong số những người khác). Không nên có releasessự chia sẻ giống hệt medium/ countrykết hợp.
Làm thế nào tôi có thể viết điều này như là một xác nhận đường ray?
Tôi có một Releasemô hình với mediumvà countrycột (trong số những người khác). Không nên có releasessự chia sẻ giống hệt medium/ countrykết hợp.
Làm thế nào tôi có thể viết điều này như là một xác nhận đường ray?
Câu trả lời:
Bạn có thể sử dụng xác nhận tính duy nhất với scopetùy chọn.
Ngoài ra, bạn nên thêm một chỉ mục duy nhất vào DB để ngăn các bản ghi mới vượt qua các xác nhận khi được kiểm tra cùng lúc trước khi được viết:
class AddUniqueIndexToReleases < ActiveRecord::Migration
def change
add_index :releases, [:country, :medium], unique: true
end
end
class Release < ActiveRecord::Base
validates :country, uniqueness: { scope: :medium }
end
uniquekhông được công nhận. Đối với phần đó tôi đã sử dụng câu trả lời dưới đây.
uniqueness, không unique. Xem các tài liệu liên kết. Sửa câu trả lời.
Tất cả các câu trả lời ở trên đều thiếu cách xác thực tính duy nhất của nhiều thuộc tính trong một mô hình. Mã dưới đây dự định cho biết cách sử dụng nhiều thuộc tính trong một phạm vi.
validates :country, uniqueness: { scope: [:medium, :another_medium] }
Nó xác nhận tính duy nhất của countrytất cả các hàng với các giá trị mediumvà another_medium.
Lưu ý: Đừng quên thêm chỉ mục vào cột trên, điều này đảm bảo truy xuất nhanh và thêm xác thực mức DB cho các bản ghi duy nhất.
Cập nhật: Để thêm một chỉ mục trong khi tạo bảng
t.index [:medium, :another_medium], unique: true
Bạn có thể truyền :scopetham số cho trình xác nhận của mình như thế này:
validates_uniqueness_of :medium, scope: :country
Xem tài liệu cho một số ví dụ khác.