Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 将2个哈希数组组合成一个JSON响应_Ruby On Rails_Ruby - Fatal编程技术网

Ruby on rails 将2个哈希数组组合成一个JSON响应

Ruby on rails 将2个哈希数组组合成一个JSON响应,ruby-on-rails,ruby,Ruby On Rails,Ruby,我在一个有新闻提要功能的网站上工作。我想从包含项的表中提取数据,从包含用户的表中提取数据,然后将部分数据合并到JSON响应中。两者都是散列数组。我不想把所有的领域,只是部分 我在想,我会拉两个完整的记录,然后在一个方法中进行组合,以便只命中数据库两次。我可以使用以下工具轻松拉动最后5项: class NewsfeedsController < ApplicationController before_action :authenticate_user! def index

我在一个有新闻提要功能的网站上工作。我想从包含项的表中提取数据,从包含用户的表中提取数据,然后将部分数据合并到JSON响应中。两者都是散列数组。我不想把所有的领域,只是部分

我在想,我会拉两个完整的记录,然后在一个方法中进行组合,以便只命中数据库两次。我可以使用以下工具轻松拉动最后5项:

class NewsfeedsController < ApplicationController
  before_action :authenticate_user!

  def index
    @newsfeed_data = json_response(return_items(params[:limit]))
  end

  private

  def return_items(limit)
    output = Item.last(limit=limit).reverse
  end
end
以下是我想要的输出:

{
  "name": "Item name",
  "type": "Item type",
  "first_name": "User owner's first name",
  "company": "User's company",
  "avatar": "URL string to saved image"
}

您可以这样做,但rails可能已经构建了用于提取JSON响应的功能

def return_items(limit=10)
    items = Item.includes(:user).select('user_id, name, type, etc_you_want_to_pick').first(limit)
    response = []
    items.each do |item|
      response << {
        "name": item.name,
        "type": item.type,
        "first_name": item.user.first_name,
        "company": item.user.company,
        "avatar": item.user.avatar
      }
    end
    return response
  end
def退货项目(限额=10)
项目=项目。包括(:用户)。选择('user\u id,name,type,etc\u you\u want\u pick')。首先(限制)
响应=[]
项目。每个do |项目|

response您可以这样做,但rails可能已经构建了用于提取JSON响应的功能

def return_items(limit=10)
    items = Item.includes(:user).select('user_id, name, type, etc_you_want_to_pick').first(limit)
    response = []
    items.each do |item|
      response << {
        "name": item.name,
        "type": item.type,
        "first_name": item.user.first_name,
        "company": item.user.company,
        "avatar": item.user.avatar
      }
    end
    return response
  end
def退货项目(限额=10)
项目=项目。包括(:用户)。选择('user\u id,name,type,etc\u you\u want\u pick')。首先(限制)
响应=[]
项目。每个do |项目|

响应执行此操作的最干净、最可维护的方法是使用
ActiveRecordSerializers
gem

  • app/serializers/newsfeeds\u serializer.rb
  • 在该文件中,定义如下所示的序列化程序:

    class NewsfeedsSerializer < ActiveModel::Serializer
      attributes :name, :type, :first_name, :company, :avatar
    
      def first_name
        object.user.first_name
      end
    
      def company
        object.user.company
      end
    
      def avatar
        object.user.avatar
      end
    end
    
    class newsfeedserializer
  • 在控制器中,按如下方式编写索引路由:

    class NewsfeedsController < ApplicationController
      before_action :authenticate_user!
    
      def index
        @items = Item
          .order(created_at: :desc)
          .limit(params[:limit])
          .includes(:user)
        render json: @items, each_serializer: NewsfeedsSerializer
      end
    end
    
    class NewsfeedsController
  • 这将使用我们在序列化程序中定义的方法序列化每个
    对象。使用将预加载每个
    项所属的
    用户
    项,因此我们将使用的所有内容都将在一次数据库调用中获取


    如果您想要编辑要发送的JSON,很容易对序列化程序进行更改。如果您在设置时遇到任何问题,或者想要更多自定义配置(
    camelCased
    键或类似的东西),我建议您阅读ActiveModelSerializer。

    最干净、最可维护的方法是使用
    ActiveRecordSerializer
    gem

  • app/serializers/newsfeeds\u serializer.rb
  • 在该文件中,定义如下所示的序列化程序:

    class NewsfeedsSerializer < ActiveModel::Serializer
      attributes :name, :type, :first_name, :company, :avatar
    
      def first_name
        object.user.first_name
      end
    
      def company
        object.user.company
      end
    
      def avatar
        object.user.avatar
      end
    end
    
    class newsfeedserializer
  • 在控制器中,按如下方式编写索引路由:

    class NewsfeedsController < ApplicationController
      before_action :authenticate_user!
    
      def index
        @items = Item
          .order(created_at: :desc)
          .limit(params[:limit])
          .includes(:user)
        render json: @items, each_serializer: NewsfeedsSerializer
      end
    end
    
    class NewsfeedsController
  • 这将使用我们在序列化程序中定义的方法序列化每个
    对象。使用将预加载每个
    项所属的
    用户
    项,因此我们将使用的所有内容都将在一次数据库调用中获取


    如果您想要编辑要发送的JSON,很容易对序列化程序进行更改。如果您在设置时遇到任何问题,或者想要更多自定义配置(
    camelCased
    键或类似的东西),我建议您阅读ActiveModelSerializer。

    您能给出一个JSON响应的示例吗?另外,如果您提到一个
    项目
    模型,但在您的示例中,您将
    交易
    。如果您能提供更多关于模型的详细信息,这将使您更容易获得帮助:)对不起,这是从另一个项目复制代码。我为每个记录中包含的内容和我希望得到的输出添加了模式。你能给出一个你希望JSON响应的示例吗?另外,如果您提到一个
    项目
    模型,但在您的示例中,您将
    交易
    。如果您能提供更多关于模型的详细信息,这将使您更容易获得帮助:)对不起,这是从另一个项目复制代码。我为每个记录添加了模式,以及我希望得到的输出。非常好,谢谢!在我需要写的下一系列回复中,这个扩展非常好。如果你想更新你的答案,我只需要做几次编辑就可以了。在上一次调用中,我必须调用
    每个序列化程序:NewsfeedSerializer
    ,并且我需要包含定义为属性的方法,因此整行内容都是
    属性:name,:type,:first\u name,:company,:avatar
    。不过效果很好。谢谢你给我介绍这个宝石。@OneWorking耳机做了改动,很高兴你弄明白了!太好了,谢谢!在我需要写的下一系列回复中,这个扩展非常好。如果你想更新你的答案,我只需要做几次编辑就可以了。在上一次调用中,我必须调用
    每个序列化程序:NewsfeedSerializer
    ,并且我需要包含定义为属性的方法,因此整行内容都是
    属性:name,:type,:first\u name,:company,:avatar
    。不过效果很好。谢谢你给我介绍这个宝石。@OneWorking耳机做了改动,很高兴你弄明白了!太棒了,谢谢你!既然我要走了