gpt4 book ai didi

ruby-on-rails - 如果存在,我如何拒绝?对于非嵌套属性?

转载 作者:行者123 更新时间:2023-12-04 06:56:03 24 4
gpt4 key购买 nike

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

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



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

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

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

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

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



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

最佳答案

尝试这个:

@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

在您的 Controller 中:
@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 的唯一性,无论链接是如何创建的。

关于ruby-on-rails - 如果存在,我如何拒绝?对于非嵌套属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2562832/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com