Rails ActiveRecord为belongs_to
提供了一个optional
选项。考虑允许外键为null并允许关联在对象创建期间为null的用例,但在随后的保存中要求它的存在。例如,新成员可能没有初始组,但任何成员的进一步更新都需要组关联。
optional
选项值本身可以是条件值吗?例如,
class Member < ApplicationRecord
belongs_to :group, optional: -> { new_record? }
end
它的行为与optional: true
相同,我们可以推断optional
选项解析只检查一个真实的值。
自定义验证器是满足此用例的实用方法吗?
发布于 2017-12-30 17:23:07
看起来,向optional
选项提供lambda是行不通的(尽管我还没有试过)。我看了一下源代码,这就是optional
的用法。
required = !reflection.options[:optional]
如果需要,Rails只是添加如下的存在验证:
model.validates_presence_of reflection.name, message: :required
我相信你可以像这样走定制路线:
class Member < ApplicationRecord
belongs_to :group, optional: true
validates :group, presence: true, on: :update
end
发布于 2017-12-30 17:23:00
您不是在描述数据库约束,而是描述业务逻辑。添加验证器以强制执行该条件:
validates :group, presence: true, on: :update
这只会在更新时强制执行条件,而不是创建条件。
发布于 2018-07-12 04:44:46
我也遇到了同样的问题。我的解决方案是重写belongs_to
并添加一个unless
选项,该选项接受谓词函数的符号。似乎是个好主意..。
这样你就可以写belongs_to :group, unless: :new_record?
了
这是我的密码
def self.belongs_to(name, scope = nil, options = {})
if scope.is_a?(Hash)
options = scope
scope = nil
end
if options.has_key? :unless
super name, scope, options.merge(optional: true).except(:unless)
validates name, presence: true, if: ->{ !self.send(options[:unless]) }
else
super
end
end
https://stackoverflow.com/questions/48036112
复制相似问题