【问题标题】:Rails Active Record Query and JSONRails 活动记录查询和 JSON
【发布时间】:2013-02-20 11:43:27
【问题描述】:

我的 Rails 应用程序中有以下模型:

class Transaction 
  belongs_to :category
  has_one :group, :through => :category

class Category
  belongs_to :group
  has_many :transactions

class Group
  has_many :categories
  has_many :transactions, :through => :category

在我的控制器中如下:

 @transactions = Transaction.includes(:category, :group).group("groups.id").sum("amount")
 respond_to do |format|
  format.json{
    render :json => JSON.generate(@transactions.as_json(:include => [:category, :group]))
  }
 end

这会产生以下 json (A):

 {"1":2000,"3":5000,"2":1000}

但是,我的目标是制作这样的东西(B):

 [{"group_id":1,"amount":2000},{"group_id":3,"amount":5000},{"group_id":2,"amount":1000}]

任何关于我如何从 AB 的帮助将不胜感激。

【问题讨论】:

    标签: ruby-on-rails json rails-activerecord


    【解决方案1】:

    试试:

    def user_transactions
      @transactions = Transaction.includes(:category, :group).group("groups.id").sum("amount")
      respond_to do |format|
        format.html
        format.json do
          render :json => custom_json_for(@transactions)
        end
      end
    end
    
    private
    def custom_json_for(value)
      list = value.map do |k,v|
        { :group_id => k,
          :amount=> v    
        }
      end
      list.to_json
    end
    

    【讨论】:

    • 感谢您的帮助。但是,这给了我以下错误:NoMethodError: undefined method 'group_id' for [1, 2000]:Array
    • group_id 替换为您想要的表的列名。
    • 如果我将您的答案改为:list = value.map do |k, v| { :group_id => k, :amount => v } end
    【解决方案2】:

    如果您要进行大量 JSON 序列化,我建议您查看 ActiveModelSerializers: https://github.com/rails-api/active_model_serializers

    【讨论】:

      猜你喜欢
      • 2013-02-01
      • 1970-01-01
      • 2016-11-10
      • 2016-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多