【问题标题】:Validate only first two built objects title attribute of nested attributes rails仅验证嵌套属性 rails 的前两个构建对象标题属性
【发布时间】:2018-06-04 11:29:35
【问题描述】:

我正在为接受选项作为嵌套属性的课程构建 4 个学习目标对象。我只想验证学习目标的前两个标题值的存在,而 2 应该是可选的,即如果为空则拒绝。

class Course < ApplicationRecord
    has_many :learning_objectives
    accepts_nested_attributes_for :learning_objectives
end

class LearningObjective < ApplicationRecord
   belongs_to :course
   validates_presence_of :title
end

如何仅验证前 2 个构建对象?

【问题讨论】:

  • 你有没有尝试过?
  • 我认为你必须更具体一点。所有选项实例都是同一模型吗?你能发布那个模型和它的属性吗?正如@Зелёный 所说,您应该始终指定您尝试过的内容。
  • 更新了我的问题

标签: ruby ruby-on-rails-4 ruby-on-rails-5 nested-attributes


【解决方案1】:

添加custom validation method,如:

class Course < ApplicationRecord
  has_many :learning_objectives
  accepts_nested_attributes_for :learning_objectives

  MIN_LEARNING_OBJECTIVES = 2
  MAX_LEARNING_OBJECTIVES = 4

  validate :learning_objectives_count_in_range

  private

  def learning_objectives_count_in_range
    objectives_count = learning_objectives.count
    return if objectives_count.between?(MIN_LEARNING_OBJECTIVES, MAX_LEARNING_OBJECTIVES)

    errors.add(:base, "must have between #{MIN_LEARNING_OBJECTIVES} and #{MAX_LEARNING_OBJECTIVES} learning objectives")
  end
end

【讨论】:

  • 我实际上想验证学习目标的标题而不是整个对象的存在。它应该只验证前两个学习目标的标题,如果标题的其余部分为空白,则拒绝。
  • 我不明白。 “验证前两个......如果其余为空白,请休息。”你的意思是只有前两个目标需要标题吗?
  • titled_objectives_count = learning_objectives.where.not(title: [nil, '']).countuntitled_objectives_count = learning_objectives.where(title: [nil, '']).count。用你试图描述的任何逻辑来修改我上面的方法应该是相当容易的,不是吗?
  • 当然,如果标题对于某些学习目标实际上是可选,那么您应该在@987654326 上使用validates_presence_of :title @.
猜你喜欢
  • 1970-01-01
  • 2014-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-26
  • 2020-12-02
  • 1970-01-01
  • 2011-01-07
相关资源
最近更新 更多