我有一个场景,需要将关联记录的名称保存在当前对象中。
请考虑我有一个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
我添加了其他一些逻辑(请检查上面的验证器中的注释)。在验证器中使用除验证逻辑以外的最佳实践吗?
答案 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中存在的记录数,而不是将所有数据加载到内存中。并在保存回调后在其中添加另一个表的名称