Tôi muốn giới hạn số lượng mục trong một hiệp hội. Tôi muốn đảm bảo Người dùng không có nhiều hơn X Thứ. Câu hỏi này đã được hỏi trước đây và giải pháp có logic trong đứa trẻ:
Giải pháp được cung cấp (cho vấn đề tương tự):
class User < ActiveRecord::Base
has_many :things, :dependent => :destroy
end
class Thing <ActiveRecord::Base
belongs_to :user
validate :thing_count_within_limit, :on => :create
def thing_count_within_limit
if self.user.things(:reload).count >= 5
errors.add(:base, "Exceeded thing limit")
end
end
end
Mã cứng "5" là một vấn đề. Giới hạn của tôi thay đổi dựa trên phụ huynh. Bộ sưu tập Những thứ biết giới hạn của nó liên quan đến Người dùng. Trong trường hợp của chúng tôi, Người quản lý có thể điều chỉnh giới hạn (Số thứ) cho mỗi Người dùng, vì vậy Người dùng phải giới hạn bộ sưu tập của mình. Chúng tôi có thể yêu cầu thing_count_within_limit yêu cầu giới hạn từ người dùng của nó:
if self.user.things(:reload).count >= self.user.thing_limit
Tuy nhiên, đó là rất nhiều sự xem xét nội tâm của người dùng từ Thing. Nhiều cuộc gọi đến người dùng và đặc biệt, đó (:reload)
là những dấu hiệu đỏ đối với tôi.
Suy nghĩ về một giải pháp phù hợp hơn:
Tôi nghĩ has_many :things, :before_add => :limit_things
sẽ hiệu quả, nhưng chúng ta phải nêu ra một ngoại lệ để ngăn chặn chuỗi . Điều đó buộc tôi phải cập nhật things_controller để xử lý các ngoại lệ thay vì quy ước rails của if valid?
hoặc if save
.
class User
has_many :things, :before_add => limit_things
private
def limit_things
if things.size >= thing_limit
fail "Limited to #{thing_limit} things")
end
end
end
Đây là Rails. Nếu tôi phải làm việc chăm chỉ như thế này, có lẽ tôi đang làm sai điều gì đó.
Để thực hiện việc này, tôi phải cập nhật mô hình mẹ, bộ điều khiển của con VÀ tôi không thể tuân theo quy ước? Tui bỏ lỡ điều gì vậy? Tôi có đang lạm dụng has_many, :before_add
không? Tôi đã tìm kiếm một ví dụ bằng cách sử dụng: before_add, nhưng không thể tìm thấy bất kỳ ví dụ nào.
Tôi đã nghĩ đến việc chuyển xác thực cho Người dùng, nhưng điều đó chỉ xảy ra trên Lưu / cập nhật Người dùng. Tôi không thấy có cách nào để sử dụng nó để ngăn việc thêm Thứ.
Tôi thích một giải pháp hơn cho Rails 3 (nếu điều đó quan trọng đối với vấn đề này).