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)
祝你好运,如果你需要更多关于正确方向的指示,请告诉我.
在某些情况下,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”,因此它可以在添加条目时进行验证。
使用它,您可以通过传递参数来使用和不使用验证。