2017-10-03 1 views
0

データベースからデータを取得しています。 JSONで送信します。Rails - フィールドを動的に追加するために、ActiveRecordを単純なオブジェクトに変換します。

enter image description here

事は、私は動的にフィールド "CAMPAIGN_NAME" を追加する必要があり、です。

def loadtimeline 
    @act = Activity.order('created_at desc').paginate(:page => params[:page], :per_page => 40) 

    @act.each do |item| 
     item.attributes[:campaign_name] = item.campaign.name 
    end 

    respond_to do |format| 
     format.json do 
     render json: @act 
     end 
    end 
end 

最後に、クライアントをチェックすると、新しいフィールドは表示されません。

私はそれがこのオブジェクトに関連している可能性があると私に語ったActiveRecordモデルです。だから私はそれをオブジェクトとして変換しようとしています。

これは可能ですか、必要なフィールドを追加する方法はありますか?

ありがとうございました。

EDIT1。 私は正確ではありませんでしたが、item.campaignは他のモデルキャンペーンに属しています。

class Activity < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :campaign 

    attr_accessor :campaign_name 

    def item 
    if item_path && item_id 
     case item_path 
     when /todo/ 
      Todo.find(item_id) 
     when /content/ 
      Content.find(item_id) 
     when /netlinking/ 
      Netlinking.find(item_id) 
     else 
      nil 
     end 
    end 
    end 
end 
+0

あなたの活動モデルは右、キャンペーンに属していますか? (campaign_id) – Anton

+2

したがって、jbulderのようなものを使用するか、シリアライザで構築する場合は、キャンペーンをアクティビティクエリに含めることができ、その名前をビューに直接フェッチすることができます。 – Anton

+0

私はそれをシリアル化しようとします。ありがとう! –

答えて

2

次のようないくつかのことでこれを実現できます。そして、行為の配列をレンダリング

@act = Activity.includes(:campaign).order('created_at desc') 
acts = [] 
@act.each do |item| 
    acts << item.attributes.merge({campaign_name: item.campaign.name}) 
end 


私はビューを使用することがより明確だと思います。

+0

ビューを使用できません。バインドする要素が多すぎます。それは非常に遅くなります。 –

1
a = @act.to_json 
b = JSON.parse(a) 
b.each do |item| 
item["campaign_name"] = item.campaign.name 
end 

または単一の行で

JSON.parse(@act.to_json).each do |item| item["campaign_name"] = item.campaign.name end 
関連する問題