如何使用find_or_create_by_跳过验证?

Mar*_*tto 7 ruby validation activerecord ruby-on-rails ruby-on-rails-3

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

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

p = Post.new
p.title = nil
p.body = nil
p.save(:validate => false)
Run Code Online (Sandbox Code Playgroud)

愿意做同样的事情find_or_create_by_title.

Dev*_*n M 14

现在使用Rails中代码看起来很可能,但是如果你编写代码的话,你可能会有更好的运气.您可以使用find_or_initialize_by_它创建一个新对象但不保存它.然后,您可以使用自定义选项调用save,也可以在文档中使用很难找到的简洁演示,因此我将在下面包含它:

# No 'Winter' tag exists
winter = Tag.find_or_initialize_by_name("Winter")
winter.new_record? # true
Run Code Online (Sandbox Code Playgroud)

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


Roh*_*wal 6

在某些情况下,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
Run Code Online (Sandbox Code Playgroud)

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

我已经使用了first_or_create而不是find_or_create_by这里。您可以使用此传递更多列名和值,并且您的验证将无法使用。

  • 您可以继续而无需对强参数进行任何更改,并且无需允许此“skip_validation”,因此它可以在添加条目时进行验证。

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