我正在尝试这样做
has_many :roles, :before_add => :enforce_unique
def enforce_unique(assoc)
false if exists? assoc
end
来自文档:“如果 before_add 回调引发异常,则该对象不会添加到集合中”。上面的 using false 并不能阻止添加,所以我被迫这样做:
def enforce_unique(assoc)
raise if exists? assoc
end
这样,它确实不会被添加,但它也会引发一个必须处理的异常。这里对我不是很有用。我希望它的行为更像 before_save 的常规 AR 回调,其中返回 FALSE 也会阻止保存(或添加)但不会引发异常。
在上面的这种情况下,我希望这只是不要默默地添加关联。有没有办法做到这一点?我错过了什么?或者引发异常是这里唯一的选择?
最佳答案
我认为解决它的方法是使用throw
和 catch
, 在 Ruby 中用于流量控制。提出异常并不合适,因为这不是特殊情况。
我最终做了:
catch(:duplicate) do
association.create({})
end
然后在
before_add
回调,我做了:if(Class.where({}).first)
throw :duplicate
end
更多关于 throw /捕捉在这里:
http://rubylearning.com/blog/2011/07/12/throw-catch-raise-rescue-im-so-confused/
关于ruby-on-rails - 用 before_add 关联回调静默跳过添加而不是引发异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7273792/