如果存在,我该如何拒绝?对于非嵌套属性?

时间:2010-04-01 18:50:48

标签: ruby-on-rails callback exists

目前我的控制器允许用户一次提交多个“链接”。它将它们收集到一个数组中,为该用户创建它们,但捕获任何错误以便用户返回并修复。如何忽略已为该用户存在的任何链接的创建?我知道我可以将validates_uniqueness_of与该用户的作用域一起使用,但我宁愿完全忽略它们的创建。这是我的控制器:

  

@links =   params [:links] .values.collect {| link |   current_user.links.create(链接)   } .reject {| p | p.errors.empty? }

每个链接都有一个url,所以我考虑检查该用户是否已经存在link.url,但是不确定如何或者在哪里做到这一点。我应该以某种方式将其加到我的控制器上吗?或者它应该是模型中的新方法,就像在before_validation回调中一样? (注意:这些“链接”不是嵌套的,但它们确实属于:user。)

所以,如果可能的话,我希望能够忽略这些链接的创建。就像用户提交5个链接一样,但是其中有2个链接已经存在,那么我只是希望忽略这两个链接,而创建其他3个链接。我应该怎么做呢?

编辑:感谢Kandada,我现在正在使用它:

  

@links =   PARAMS [:链接] .values.collect.reject {   |友情链接|   current_user.links.exists?(:URL =>链接[:URL])}

     

@links = @ links.collect {| link |   current_user.links.create(链接)   } .reject {| p | p.errors.empty? }

所以我将两者分开,首先检查是否存在,然后创建那些未被拒绝的。有没有更好的方法来做到这一点,比如结合这两个语句可以提高性能?如果没有,我想我很满意。 (再次感谢Kandada和j。)

2 个答案:

答案 0 :(得分:2)

试试这个:

@links = current_user.links.create(params[:links].reject{ |link| 
           current_user.links.exists?(:url=>link[:url]) })

或者,您可以在Link模型中为url属性添加唯一性检查。

class Link
  validates_uniqueness_of :url, :scope => [:user_id]
end

在您的控制器中:

@links = current_user.links.create(params[:links])

返回的结果集是新创建的Link个对象的数组。任何与现有链接匹配的链接都将被忽略。

修改

这是另一种通过一次传递的方法。

@links = params[:links].map{|link| 
           !current_user.links.exists?(:url=> link[:url]) and
             current_user.links.create(link)}.select{|link| link and 
               link.errors.empty?}

我仍然认为你应该让你的独特验证工作,然后使用这段代码:

@links = current_user.links.create(params[:links]).select{|link| 
           link.errors.empty?}

在后一种方法中,唯一性验证在模型中完成。无论链接如何创建,这都可确保链接URL的唯一性。

答案 1 :(得分:1)

在创建之前拒绝存在链接:

new_links = params[:links].reject{ |link| current_user.links.exists?(link) }

像这样的东西。不确定这段代码......