ActiveRecord ::基类不可变?

时间:2012-11-08 16:45:37

标签: ruby-on-rails ruby activerecord immutability

我有一个我从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试了这个,并得到了相同的结果。

2 个答案:

答案 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!,您只需修改记录数组,但要将修改后的记录保存到数据库,您应该使用savesave!(如果保存失败则会引发异常)记录。