如何验证模型,无论它是否具有特定列? 关注

问题描述

collate_fn

关注

@foreach (var item in Model.AvaliableCategories)
                {
                    if (item.Selected)
                    {
                        <option value="@item.Value" selected="selected">@item.Text</option>
                    }
                    else
                    {
                        <option value="@item.Value">@item.Text</option>
                    }
                }

在我的 项目模型我有 class Project include Listable listtable(data_attribute: :verified_at) end 列。如果我的表中没有 verify_at 列,它应该会引发错误

但是这里没有正确响应。总是引发错误(甚至verified_at也存在)

预期

无论我在模型中的何处包含此问题,它都应该检查 Verified_at 列是否存在。如果不存在,则应引发错误

这对我来说没有发生,请建议我任何解决方案,提前致谢

解决方法

问题在于模型没有按照您预期的方式respond_to?

Project.respond_to?(:id)
# false

为什么?因为您是在询问类本身是否具有 id 属性,该属性仅适用于实例。

Project.first.respond_to?(:id)
# true

要解决此问题,您可以像这样利用 Project.column_names 方法。

raise ActiveModel::MissingAttributeError,"Must have a verified_at attribute" unless column_names.include?('verified_at')
,

Listable 模块在这里不是绝对必要的。 Rails 带有开箱即用的 ActiveRecord 验证,类似这样的事情可以满足您的需求:

class Project
  validates :verified_at,presence: true
end

然后您可以实例化一个 Project 并检查它是否有效。如果 .valid? 返回 false,则无法将其保存到数据库中:

project = Project.new
=> #<Project:0x00007ff3aec268a8
 id: nil,verified_at: nil,created_at: nil,updated_at: nil>
project.valid?
=> false
project.save!
=> ActiveRecord::RecordInvalid: Validation failed: Verified At can't be blank

project = Project.new(verified_at: Time.zone.now)
=> #<Project:0x00007ff3aec268a8
 id: nil,verified_at: Mon,11 Jan 2021 04:09:24 EST -05:00,updated_at: nil>
project.valid?
=> true
project.save!
#  DB query
=> true

一些阅读:https://guides.rubyonrails.org/active_record_validations.html

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...