2009-09-14 28 views
10

Giả sử tôi có Dự án, liên kết nhiều người với Thẻ. Tôi đang sử dụng has_many thông qua để tôi có mô hình tham gia riêng biệt.Xác nhận tính duy nhất của nhiều liên kết trong Rails

Làm cách nào để tạo xác thực, kiểm tra tính duy nhất của mô hình tham gia? Bây giờ tôi chỉ có

has_many :tags, :through => :taggings, :uniq => true 

Nhưng điều đó không xác thực khi lưu.

Trả lời

4

Hãy thử validates_associated.

Tôi nên tin rằng, hãy cho phép xác thực mô hình tham gia để chạy trước khi lưu. Vì vậy, trong trường hợp của bạn:

class Project 
    has many :tags, :through => :taggings 
    validates_associated :taggings 
end 

class Taggings 
    belongs_to :tags 

    #your validations here.... 
end 

class Tag 
    has_many :taggings 
end 
15

Tôi nghĩ rằng những gì bạn muốn là validates_uniqueness_of:

class Taggings 
    belongs_to :tags 
    validates_uniqueness_of :tag_id, :scope => :project_id 
end 

Đây là những gì tôi đang sử dụng, và hoạt động tốt.

+0

Xin chào, nhưng khi tôi thêm một thẻ trùng lặp vào dự án với 'project.tags << Tag.find_or_create_by_name" Design "' nó sẽ tạo ra một ngoại lệ 'ActiveRecord :: ValidateError', có cách không âm thầm khi trùng lặp trong khi thêm thẻ không có vấn đề khi thẻ mới? Cách tốt nhất để quản lý điều này là gì? Cảm ơn –

+0

Có lẽ một cách đơn giản hơn để thực hiện điều đó, nhưng tôi nghĩ rằng điều này sẽ chỉ thêm các mục không trùng lặp: 'design_tags = Tag.find_or_create_by_name" Thiết kế " project.tags << design_tags.reject {| tag | project.tags.include? (tag)} ' –

Các vấn đề liên quan