Ruby on rails 铁路运行协会';在创建时进行验证?
我们有三节课Ruby on rails 铁路运行协会';在创建时进行验证?,ruby-on-rails,Ruby On Rails,我们有三节课 class a has_many :b has_many :c, through: b end class b belongs_to :a belongs_to :c end class c has_many :b has_many :a, through: :b validates_uniqueness_of :name end 当我试图创建classa的实例时,如果数据库中有两个classc的对象具有相同的名称值,我惊讶地发现classc上的验
class a
has_many :b
has_many :c, through: b
end
class b
belongs_to :a
belongs_to :c
end
class c
has_many :b
has_many :a, through: :b
validates_uniqueness_of :name
end
当我试图创建classa
的实例时,如果数据库中有两个classc
的对象具有相同的名称
值,我惊讶地发现classc
上的验证正在运行!
当我根本不应该接触classc
行时,为什么要运行验证
@马克斯要求举个例子
创建新的Rails 5项目后,请执行以下操作:
rails g model a
rails g model c name:string
rails g model b a:references c:references
编辑a.rb使其看起来像:
class A < ApplicationRecord
has_many :b
has_many :c, through: :b
end
class C < ApplicationRecord
has_many :b
has_many :a, through: :b
end
修改C类以添加:
validates_uniqueness_of :name
在rails控制台中:
A.create!(c_ids: [1])
你会得到一个例外:
ActiveRecord::RecordInvalid (Validation failed: C is invalid)
正如我所说,我知道数据是错误的,但我只是惊讶于验证正在运行。我不认为Rails 4中会发生这种情况。
有许多关联在默认情况下验证关联。如果您想避开此问题,可以将有许多关联的上的验证键设置为假(默认情况下为真)。你可以在这里看到更多关于的选项:B类
如何属于B类
?在已经有多个特定名称之后,是否在C上添加了模型验证?是否接受嵌套属性,或者你正在为a类记录编写一个名为c_id
的数组?你能不能创建一个最小的可验证示例来演示你正在谈论的行为?@max添加了如何创建一个示例。太棒了!对于这是否是正确的做法,我有两种看法,但感谢您的解释。我同意,覆盖这一关键可能不是正确的做法!
ActiveRecord::RecordInvalid (Validation failed: C is invalid)