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