我想限制协会中的项目数量。我想确保用户拥有的东西不超过 X 件。这个问题之前被问过 https://stackoverflow.com/questions/7863618/rails-3-1-limit-user-created-objects解决方案有孩子的逻辑:
提供的解决方案(针对类似问题):
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
硬编码的“5”是一个问题。我的限制根据父母的变化而变化。事物的集合知道其相对于用户的限制。在我们的例子中,管理者可以调整每个用户的(事物)限制,因此用户必须限制其事物的集合。我们could让 thing_count_within_limit 向其用户请求限制:
if self.user.things(:reload).count >= self.user.thing_limit
但是,那是很多user来自事物的内省。多次致电用户,尤其是(:reload)
对我来说是危险信号。
对更合适解决方案的思考:
我想has_many :things, :before_add => :limit_things
可以,但是我们必须提出一个例外停止链条 http://guides.rubyonrails.org/association_basics.html。这迫使我更新 things_controller 来处理异常,而不是按照 Rails 约定if valid?
or 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
这是铁轨。如果我必须这么努力工作,我可能做错了什么。
为此,我必须更新父模型、子控制器,并且我不能遵循约定?我错过了什么吗?我是否滥用has_many, :before_add
?我寻找使用 :before_add 的示例,但找不到任何示例。
我考虑过将验证移至用户,但这仅发生在用户保存/更新时。我看不出有什么方法可以用它来阻止添加事物。
我更喜欢 Rails 3 的解决方案(如果这对这个问题很重要的话)。