我有一个包含许多字段的搜索表单。每个字段都是用于搜索非常大的数据库的参数。这些参数将传递给搜索对象。某些参数组合是有效的,其他参数组合则不是(它们对系统负载过重)。为参数组合编写验证的最佳方法是什么?例如:您应该能够按名称和另一个字段进行搜索,但不能单独搜索名称。在某些情况下,如果您在一个字段中输入值,则无法在其他字段中输入值
目前我的搜索课中有类似的内容。
SEARCHABLE_ATTRIBUTES = [:name, :city, :state, :phone, :invoice_number, :payment_amount, :payment_date, :current_balance]
validate: valid_combinations
def valid_combinations
unless name.present? && (SEARCHABLE_ATTRIBUTES - [:name, :invoice_number]).select{|sa| send(sa).present?}.any?
errors.add(:name, "can't be given alone.")
end
if name.present? && invoice_number.present?
errors.add(:invoice_number, "can't be searched with name")
end
end
我的有效搜索参数限制比这更复杂,但这只是一个例子。有一个更好的方法吗?我想避免使用一种大的valid_combinations方法。
答案 0 :(得分:1)
您可以将条件传递给验证,只有当该条件返回true时才会运行。
因此,您可以创建单独的验证方法并使用它们:
validate :at_least_another_column, if: Proc.new{|record| record.name }
或者,如果您创建一个名为name_present
的条件方法,您可以这样编码:
validate :at_least_another_column, if: :name_present
要替换您的第二个条件,您可以使用:absence
和:message
选项。看起来像这样:
validates :invoice_number, absence: true, if: :name_present , message: "can't be searched with name"
正如您所看到的,使用单独的验证时,代码变得更加清晰和易懂。但是,根据您的条件可能有多复杂,创建一个巨大的验证方法可能更容易
还有更多关于验证here
的内容