Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/52.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 使用活动记录将数据放入数据库时转换数据_Ruby On Rails_Activerecord - Fatal编程技术网

Ruby on rails 使用活动记录将数据放入数据库时转换数据

Ruby on rails 使用活动记录将数据放入数据库时转换数据,ruby-on-rails,activerecord,Ruby On Rails,Activerecord,在数据库中存储/加载数据时,转换数据(字段值)的最干净方法是什么 我通常转换用户在模型类中输入的值: def date_str format_date(self.date) end def date_str=(str) self.date = DateParser.parse(str) end (注意:内部日期分析器是不够的,它没有涵盖我们的许多区域设置日期表示法样式) 这已经很好了,但是我不让我用通常的RoR方法检查有效性,因为我们不存储用户输入的字符串。如

在数据库中存储/加载数据时,转换数据(字段值)的最干净方法是什么

我通常转换用户在模型类中输入的值:

  def date_str
    format_date(self.date)
  end

  def date_str=(str)
    self.date = DateParser.parse(str)
  end
注意:内部日期分析器是不够的,它没有涵盖我们的许多区域设置日期表示法样式)

这已经很好了,但是我不让我用通常的RoR方法检查有效性,因为我们不存储用户输入的字符串。如果日期有任何错误,我通常会让解析器函数返回nil,但这对用户来说并不友好——我真的无法判断用户是否没有输入任何内容或只是一个无效值

我正在寻找某种方法来更好地将转换集成到A::R世界中,如果转换失败,我可以在那里生成一些有用的错误消息。最好是我可以使用与A::R::Adapter内部使用的相同的工具


有人有什么好主意吗?还有什么其他方法

您建议的方式很好,另一种选择是

attr_accessor :when

before_validation :update_date

def update_date
  self.date = parse_date(self.when) if self.when
end

def parse_date(date_as_string)
  # do something with the date
end
但是,您必须自己编写验证。这并不理想,但不应该有那么多代码

如果您计划在应用程序中使用此功能,您也应该考虑编写自定义验证程序,您可以在此处获得更多信息:

提供了一个很好的dsl来完成这类工作:

class Klass < ActiveRecord::Base

  normalize_attributes :date do |value|
    value.is_a?(String) ? DateParser.parse(value) : nil
  end

end
类Klass您可以在验证前回调中执行此操作,这样您就可以在日期使用正常的AR验证

before_validation :convert_date

def convert_date
   self.date = DateParser.parse(self[:date])
end

嗯,但是setter方法有什么不同呢?在验证过程中,只有解析后的值才可以访问,对吗?