1

我有一个从 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
    }

起初我只是在每个循环中执行此操作,但尝试收集!看看它是否会解决问题,但没有区别。我错过了什么?

PS - 我在 irb 的一张唱片上试过这个并得到了相同的结果。

4

2 回答 2

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 时,它们将自动使用此逻辑生成中间散列。您也不会冒意外将格式化日期保存到数据库的风险。

如果您不想要格式化逻辑,您还可以设置自己的自定义选项名称。

这篇博客文章更详细地解释了。

于 2012-11-08T19:00:37.203 回答
0

尝试添加record.save!之前record

实际上,通过使用collect!,您只是修改了记录数组,但是要将修改后的记录保存到数据库中,您应该在每条记录上使用saveor save!(如果保存失败,则会引发异常)。

于 2012-11-08T16:53:57.840 回答