[英]Include module contionally in Rails
考虑多个具有重叠字段和功能的 ActiveRecord 类,并且其中许多重叠字段具有相同的验证。 我正在尝试共享验证,但如果满足条件(基于模型的非重叠属性之一),则不运行共享代码。
class Book < ApplicationRecord
include SharedValidation
end
class Magazine < ApplicationRecord
include SharedValidation
end
module SharedValidation
extend ActiveSupport::Concern
include ActiveModel::Validations
validates_presence_of :name, :publisher, :author
end
所以假设Magazine.is_deleted
是一个 Magazine-only 字段,我们只想在 is_deleted 为false 时运行共享验证。 关于如何在课堂上实现这一点的任何想法?
注意:我尝试通过执行字段检测和评估来修改模块,但不确定这是否有意义或是否有效:
module SharedValidation
extend ActiveSupport::Concern
include ActiveModel::Validations
included do
proc do |rcd|
has_deleted_field = self.column_names.include?('is_deleted')
if (has_deleted_field && !rcd.is_deleted) || !has_deleted_field
validates_presence_of :name, :publisher, :author
end
end
end
end
看起来您可以将条件添加到验证方法中(在 SharedModule 中),而不是有条件地包含模块。
使用您的样品:
class Book < ApplicationRecord
include SharedValidations
end
class Magazine < ApplicationRecord
include SharedValidations
end
module SharedValidations
extend ActiveSupport::Concern
include ActiveModel::Validations
def deleted
return unless self.class.column_names.include?("is_deleted")
is_deleted
end
included do
validates :name, :publisher, presence: true, unless: :deleted
end
end
Magazine 有name
、 publisher
和is_deleted
列。 Book 只有name
, publisher
没有is_deleted
。
看起来这个设置有效。
irb> book = Book.new()
=> #<Book id: nil, name: nil, publisher: nil, created_at: nil, updated_at: nil>
irb> book.valid?
=> false
irb> book.errors.full_messages
=> ["Name can't be blank", "Publisher can't be blank"]
irb> magazine = Magazine.new
=> #<Magazine id: nil, name: nil, publisher: nil, is_deleted: nil, created_at: nil, updated_at: nil>
irb> magazine.valid?
=> false
irb> magazine.errors.full_messages
=> ["Name can't be blank", "Publisher can't be blank"]
irb> magazine.is_deleted=true
=> true
irb> magazine.valid?
=> true
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.