是否可以使用动态查找/创建方法跳过验证?
例如,对于常规保存,我可以执行以下操作:
p = Post.new
p.title = nil
p.body = nil
p.save(:validate => false)
愿意对find_or_create_by_title
做同样的事情。
答案 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