gpt4 book ai didi

ruby-on-rails - 何时何地聚合或计算 RESTful Rails API 中的数据

转载 作者:太空宇宙 更新时间:2023-11-03 18:03:19 24 4
gpt4 key购买 nike

我想知道在 Rails 或一般的 MVC 中是否有一种通用的方法来聚合数据或对其执行计算(例如,随机抓取电影剧本的十行,或者将十个产品价格相互相乘) .具体来说,我正在尝试在我的应用程序中执行第一个示例(电影脚本的 10 行)。

我使用的是 Rails 5.2+。到目前为止,我已经尝试在我的 ScriptLinesController 中创建一个实例方法 getRandomLines。但是我不确定我是否应该改为使用 show 方法并在客户端聚合数据,或者我是否应该将该方法放在模型 ScriptLine

我已经使用 Postman 测试了以下路线并且它有效,但它似乎是错误的方法:

#My routes.rb:
Rails.application.routes.draw do
# For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html

get 'script_lines/test', to: 'script_lines#getRandomLines'

end

我的 Controller 看起来像这样:

class ScriptLinesController < ApplicationController
def index
render json: ScriptLine.all
end

def show
scriptLine = ScriptLine.find_by(id: params[:id])

render json: scriptLine
end

def getRandomLines
numLines=rand(0..9)
nineLines = []
numLines.times do
id_num = rand(1..ScriptLine.last.id)
nineLines << ScriptLine.find_by(id: id_num)
end

render json: nineLines[0]
end
end

我的模型是这样的:

class ScriptLine < ApplicationRecord
validates :line_number, presence:true

belongs_to :script
end

最后我的模式是这样的:

  create_table "script_lines", force: :cascade do |t|
t.string "line_number"
t.string "line"
t.bigint "script_id"
t.index ["script_id"], name: "index_script_lines_on_script_id"
end

总而言之,在 Controller 中创建方法并指定这些方法的路由是否是以 RESTful 方式聚合/执行数据计算的正确方法?特别是我想知道 7 条标准 RESTful 路由是否是唯一允许的路由,或者您是否可以使用临时路由来处理符合 REST 原则的数据。

这是我的第一个问题,如果问得太多或太含糊,请提前致歉,我们会相应修改。

最佳答案

这是一个非常宽泛的设计问题,所以我将给出一个要考虑的一般指导列表:

  • RESTful 网络服务设计的一个主要组成部分是选择正确的资源,这些资源不需要直接与数据库中的表相对应。发明新资源(通常但现在总是在 models/ 中有相应的类)是完全合适的,它们可以更自然地映射到客户正在寻找的内容。
  • 一般来说,我建议在服务器端在数据库级别执行聚合(或者通过一些其他数据存储机制,如预先计算的缓存,即使数据库太慢)
  • 如果您使用的是关系数据库,那么定义执行聚合的 View 会很有用 (https://www.postgresql.org/docs/11/sql-createview.html)。然后你可以创建一个引用 View 的activerecord模型
  • 创建与路由文件中名称不同的 Controller 方法通常是不值得的。在您的示例中,我只是在 /script_lines/random 处有一个新操作 random,然后是一个 Controller 方法 random
  • 根据您想要的真正“RESTful”程度,您可能需要也可能不需要在代码库中工作,在该代码库中可以接受定义非标准 Controller 操作,并且 GET 端点返回可能会或可能不会被接受像这样的随机结果(这两个都可以打破 REST 的严格定义)。查看此答案:RESTful web service to get random number verb了解更多背景信息。

就我个人而言,如果我不太关心 RESTful-ness,我会像这样向 ScriptLinesController 添加一个新操作:

class ScriptLinesController < ApplicationController
def random
num_lines = rand(0..9)
render json: ScriptLine.order("RANDOM()").limit(num_lines)
end
end

随着时间的推移,random 函数变得越来越复杂,我会考虑将其移至 ScriptLine 模型。如果添加了更多的复杂性,这在逻辑上都与“随机脚本行的集合”的概念相关,我会将该代码移出到一个单独的其他模型并创建一个新的 Controller 。

关于ruby-on-rails - 何时何地聚合或计算 RESTful Rails API 中的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56744709/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com