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
    }

最初は、do eachループでこれを実行していましたが、収集してみました。それが物事を修正するかどうかを確認しますが、違いはありません。私は何が欠けていますか?

PS-私はこれをirbで1つのレコードで試しましたが、同じ結果が得られました。

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 に答える