如何使用find_or_create_by跳过验证?

时间:2011-08-23 04:33:50

标签: ruby-on-rails ruby ruby-on-rails-3 validation activerecord

是否可以使用动态查找/创建方法跳过验证?

例如,对于常规保存,我可以执行以下操作:

p = Post.new
p.title = nil
p.body = nil
p.save(:validate => false)

愿意对find_or_create_by_title做同样的事情。

3 个答案:

答案 0 :(得分:14)

使用code in Rails right now看起来很可能,但是你可能会有更好的运气在编写代码时更加冗长。您可以使用find_or_initialize_by_创建新对象但不保存它。然后,您可以使用自定义选项调用保存,同样在documentation中他们有一个很难找到的简洁演示,所以我将在下面添加:

# No 'Winter' tag exists
winter = Tag.find_or_initialize_by_name("Winter")
winter.new_record? # true

祝你好运,如果你需要更多关于正确方向的指示,请告诉我。

答案 1 :(得分:3)

在某些情况下,find_or_initialize_by_无用,需要跳过find_or_create_by的验证。

为此,您可以使用以下替代流程和方法ROR:

像这样更新您的模型:

class Post < ActiveRecord::Base
  attr_accessor :skip_validation
  belongs_to :user
  validates_presence_of :title, unless: :skip_validation
end

你可以像现在这样使用它:
 Post.where(user_id: self.id).first_or_create!(skip_validation: true)

我在这里使用first_or_create代替find_or_create_by。您可以使用此方法传递更多列名称和值,并且不会对此进行验证。

  • 您可以继续,不需要对强参数结束任何更改,也不需要允许此'skip_validation',以便在添加条目时使用验证。

  • 使用此功能,您可以通过传递参数来使用和不使用验证。

答案 2 :(得分:1)

当前跳过验证与find_or_create_by一起使用。

例如,运行:

  Contact.find_or_create_by(email: "hello@corsego.com).save(validate: false)

将跳过如下验证:

  validates :name, :email, presence: true, uniqueness: true