Tôi nghĩ rằng bạn có thể xác nhận với việc sử dụng .reject(&:marked_for_destruction?).length
.
Làm thế nào về điều này?
class User < ActiveRecord::Base
has_many :groups do
def length
reject(&:marked_for_destruction?).length
end
end
accepts_nested_attributes_for :groups, allow_destroy: true
validates :groups, length: { maximum: 5 }
end
Hoặc điều này.
class User < ActiveRecord::Base
has_many :groups
accepts_nested_attributes_for :groups, allow_destroy: true
GROUPS_MAX_LENGTH = 5
validate legth_of_groups
def length_of_groups
groups_length = 0
if groups.present?
groups_length = groups.reject(&:marked_for_destruction?).length
end
errors.add(:groups, 'too many') if groups_length > GROUPS_MAX_LENGTH
end
end
Sau đó, bạn có thể chỉ huy.
@user.assign_attributes(params[:user])
@user.valid?
Cảm ơn bạn đã đọc.
Tài liệu tham khảo:
http://homeonrails.com/2012/10/validating-nested-associations-in-rails/ http://qiita.com/asukiaaa/items/4797ce44c3ba7bd7a51f
tôi có lẽ sẽ sử dụng 'tags.count' sao cho DB làm việc và bạn không tải tất cả các thẻ chỉ dành riêng cho một xác nhận này. –
@Beerlington: Trên thực tế có vẻ như Nikita là đúng, bạn không muốn nhấn cơ sở dữ liệu để xác thực, bạn muốn kiểm tra độ dài thực tế của "thẻ" của đối tượng. – tokland
Nếu bạn sử dụng thẻ.size, nó thực hiện điều "đúng". xem http://blog.hasmanythrough.com/2008/2/27/count-length-size –