ruby-on-rails - 用 before_add 关联回调静默跳过添加而不是引发异常?

标签 ruby-on-rails activerecord callback

我正在尝试这样做

 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 也会阻止保存(或添加)但不会引发异常。

在上面的这种情况下,我希望这只是不要默默地添加关联。有没有办法做到这一点?我错过了什么?或者引发异常是这里唯一的选择?

最佳答案

我认为解决它的方法是使用throwcatch , 在 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/

相关文章:

javascript - Twitter Bootstrap 日期时间选择器未在模式中正确显示

ruby-on-rails - 仅查询嵌套关联记录

mysql - 防止 Rails 4 迁移将时间戳更改为日期时间?

javascript - AJAX 调用中的变量范围

ruby-on-rails - 在 Heroku 上运行 ruby​​-debug

ruby-on-rails - 如何在没有 Rhosync 或 RhoConnect 的情况下使用 Rhodes?

ruby-on-rails - 使用包含和限制日期的 ActiveRecord 查询

javascript - WebSocket 发送有关连接的额外信息

php - PHP 5.3 中范围解析和回调的差异

javascript - 加载正文(侧边栏除外)| Turbolinks rails