考慮多個具有重疊欄位和功能的 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是僅雜志欄位,并且我們只想在 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
uj5u.com熱心網友回復:
看起來您可以將條件添加到驗證方法中(在 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
雜志有name、publisher和is_deleted欄目。書上只有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
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/358369.html
上一篇:根據從RubyonRails中的params接收到的資料創建物件
下一篇:一種顯示公共資產串列的方法
