Rails验证参数组合

时间:2014-03-13 21:16:57

标签: ruby-on-rails validation

我有一个包含许多字段的搜索表单。每个字段都是用于搜索非常大的数据库的参数。这些参数将传递给搜索对象。某些参数组合是有效的,其他参数组合则不是(它们对系统负载过重)。为参数组合编写验证的最佳方法是什么?例如:您应该能够按名称和另一个字段进行搜索,但不能单独搜索名称。在某些情况下,如果您在一个字段中输入值,则无法在其他字段中输入值

目前我的搜索课中有类似的内容。

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方法。

1 个答案:

答案 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

的内容