我有一个我从ActiveRecord :: Base扩展的课程......
class Profile < ActiveRecord::Base
我从中收集记录......
records = @profile.all
工作正常,但似乎我不能成功更新属性。我不想将它们保存回数据库,只需在将它们导出为JSON之前修改它们。我的问题是,为什么我不能更新这些?我正在执行以下操作(在导出之前转换日期格式):
records.collect! { |record|
unless record.term_start_date.nil?
record.term_start_date = Date.parse(record.term_start_date.to_s).strftime('%Y,%m,%d')
end
unless record.term_end_date.nil?
record.term_end_date = Date.parse(record.term_end_date.to_s).strftime('%Y,%m,%d')
end
record
}
起初我刚刚在每个循环中执行此操作,但尝试收集!看看它是否会解决问题,但没有区别。我错过了什么?
P.S。 - 我在一条记录上用irb试了这个,并得到了相同的结果。
答案 0 :(得分:2)
我提出了一种解决问题的不同方法,它将逻辑封装在类本身中。
覆盖as_json
课程中的Profile
实例方法。
def as_json(options={})
attrs = super(options)
unless attrs['term_start_date'].nil?
attrs['term_start_date'] = Date.parse(attrs['term_start_date'].to_s).strftime('%Y,%m,%d')
end
unless attrs['term_end_date'].nil?
attrs['term_end_date'] = Date.parse(attrs['term_end_date'].to_s).strftime('%Y,%m,%d')
end
attrs
end
现在,当您将记录呈现给json时,它们将自动使用此逻辑生成中间哈希。您也不会冒着将格式化日期意外保存到数据库的风险。
如果您不想使用格式化逻辑,也可以设置自己的自定义选项名称。
这个blog post更详细地解释了。
答案 1 :(得分:0)
尝试在record.save!
之前添加record
。
实际上,通过使用collect!
,您只需修改记录数组,但要将修改后的记录保存到数据库,您应该使用save
或save!
(如果保存失败则会引发异常)记录。