Tôi có một Release
mô hình với medium
và country
cột (trong số những người khác). Không nên có releases
sự chia sẻ giống hệt medium
/ country
kế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 Release
mô hình với medium
và country
cột (trong số những người khác). Không nên có releases
sự chia sẻ giống hệt medium
/ country
kế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 scope
tù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
unique
khô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 country
tất cả các hàng với các giá trị medium
và 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 :scope
tham 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.