【问题标题】:Require a parent attribute when a child is created创建孩子时需要 parent 属性
【发布时间】:2021-08-28 17:40:48
【问题描述】:

我有一个带有属性名称的模型联系人(以及其他名称)。创建联系人记录时,它们大多是在 name 属性保留为空的情况下创建的。这需要被允许。 我的 Contact 类与 WaitListMembers 有关联

class Contact < ApplicationRecord
  has_many :waitlist_members
  # ...
end

class WaitlistMember < ApplicationRecord
  belongs_to :contact
  # ...
end

创建 WaitlistMember 后,我现在需要对联系人进行验证,确保名称不为空。

我该如何做到这一点?

【问题讨论】:

    标签: ruby-on-rails activerecord


    【解决方案1】:

    您可以使用Module#delegate 将方法调用委托给联系人:

    class WaitlistMember < ApplicationRecord
      belongs_to :contact
      delegate :name, to: :contact, prefix: true
      validates :contact_name, presence: true
    end
    

    【讨论】:

      【解决方案2】:

      我会在联系人上添加关联的验证,然后在联系人本身上使用 lambda,或者如果使用方法在 waitlist_members.any 上有条件地应用验证?

      Class Contact
        #...
        validates :name, presence: true, if: ->(contact) { contact.waitlist_members.any? }
      end
      
      Class WaitlistMember
        #...
        validates_associated :contact
        #...
      end
      

      【讨论】:

      • 我喜欢这种方法,但似乎由于 ActiveRecord 回调的顺序,可以为没有名称的联系人创建 WaitlistMember,这明确是我想要避免的.
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多