首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何声明ActiveRecord belongs_to关联的可选条件?

如何声明ActiveRecord belongs_to关联的可选条件?
EN

Stack Overflow用户
提问于 2017-12-30 17:11:55
回答 3查看 5.1K关注 0票数 11

Rails ActiveRecord为belongs_to提供了一个optional选项。考虑允许外键为null并允许关联在对象创建期间为null的用例,但在随后的保存中要求它的存在。例如,新成员可能没有初始组,但任何成员的进一步更新都需要组关联。

optional选项值本身可以是条件值吗?例如,

代码语言:javascript
运行
复制
class Member < ApplicationRecord
  belongs_to :group, optional: -> { new_record? }
end

它的行为与optional: true相同,我们可以推断optional选项解析只检查一个真实的值。

自定义验证器是满足此用例的实用方法吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-12-30 17:23:07

看起来,向optional选项提供lambda是行不通的(尽管我还没有试过)。我看了一下源代码,这就是optional的用法。

代码语言:javascript
运行
复制
required = !reflection.options[:optional]

如果需要,Rails只是添加如下的存在验证:

代码语言:javascript
运行
复制
model.validates_presence_of reflection.name, message: :required

我相信你可以像这样走定制路线:

代码语言:javascript
运行
复制
class Member < ApplicationRecord
  belongs_to :group, optional: true
  validates :group, presence: true, on: :update
end
票数 15
EN

Stack Overflow用户

发布于 2017-12-30 17:23:00

您不是在描述数据库约束,而是描述业务逻辑。添加验证器以强制执行该条件:

代码语言:javascript
运行
复制
validates :group, presence: true, on: :update 

这只会在更新时强制执行条件,而不是创建条件。

票数 0
EN

Stack Overflow用户

发布于 2018-07-12 04:44:46

我也遇到了同样的问题。我的解决方案是重写belongs_to并添加一个unless选项,该选项接受谓词函数的符号。似乎是个好主意..。

这样你就可以写belongs_to :group, unless: :new_record?

这是我的密码

代码语言:javascript
运行
复制
  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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48036112

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档