在验证器方法中编写除验证之外的其他逻辑-Rails 5

时间:2019-03-05 11:26:01

标签: ruby-on-rails activerecord ruby-on-rails-5 customvalidator

我有一个场景,需要将关联记录的名称保存在当前对象中。

请考虑我有一个JSON列,并且在该JSON列中有另一个表的ID。

例如请求:

users: {
  name: 'test', 
  additional_details: { another_table_id: 1}
}

我要做的是验证另一个表是否具有该 id (请求)。

所以我在用户模型中添加了自定义关联,

 validates :validate_additional_table


 def validate_additional_table
    a_t = AnotherTable.where(id: additional_details['another_table_id']).first

    if a_t.present?
      additional_details.merge!(another_table_record_name: a_t.name) # Is it a good practice?
    else
      errors.add(:base, 'record is invalid')
    end

 end

我添加了其他一些逻辑(请检查上面的验证器中的注释)。在验证器中使用除验证逻辑以外的最佳实践吗?

1 个答案:

答案 0 :(得分:0)

我不知道在验证中做逻辑,但是使用

 AnotherTable.exists?(id: additional_details['another_table_id'])

代替

a_t = AnotherTable.where(id: additional_details['another_table_id']).first

if a_t.present?
  additional_details.merge!(another_table_record_name: a_t.name) # Is it a good practice?

这只会获取DB中存在的记录数,而不是将所有数据加载到内存中。并在保存回调后在其中添加另一个表的名称