Ruby on rails 何时何地在RESTful Rails API中聚合或执行数据计算

Ruby on rails 何时何地在RESTful Rails API中聚合或执行数据计算,ruby-on-rails,ruby,Ruby On Rails,Ruby,我想知道,在Rails或MVC中,是否有一种聚合数据或对其执行计算(例如,随机获取电影脚本的十行,或将十个产品价格相乘)的通用方法。具体来说,我正在尝试在我的应用程序中执行第一个示例(电影脚本的10行) 我使用的是Rails 5.2+。到目前为止,我尝试的是在我的scriptlinescocontroller中创建一个实例方法getRandomLines。但是我不确定是否应该改为使用show方法并在客户端聚合数据,或者是否应该将该方法放在modelScriptLine 我已经用邮递员测试了以下路

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

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

我已经用邮递员测试了以下路线,它是有效的,但似乎是错误的方法:

#我的路线.rb:
Rails.application.routes.draw do
#有关此文件中可用DSL的详细信息,请参阅http://guides.rubyonrails.org/routing.html
获取“脚本行/测试”,至:“脚本行”
结束
我的控制器如下所示:

class ScriptLinesControllernineLines这是一个相当广泛的设计问题,所以我只想列出一个需要考虑的一般指针:

  • RESTfulWeb服务设计的一个主要组件是选择正确的资源,这些资源不需要直接与数据库中的表对应。发明新的资源(通常但现在总是在
    模型/
    中有一个对应的类)是完全合适的,它更自然地映射到客户机正在寻找的内容
  • 一般来说,我建议在数据库级别的服务器端执行聚合(如果数据库速度太慢,也可以通过一些其他数据存储机制,如预计算缓存)
  • 如果您使用的是关系数据库,那么定义执行聚合()的视图会很有用。然后,您可以创建一个引用该视图的activerecord模型
  • 通常不值得创建与routes文件中命名不同的控制器方法。在你的例子中,我只需要在
    /script\u lines/random
    上有一个新动作
    random
    ,然后是一个控制器方法
    random
  • 根据您想要的真正的“RESTful”程度,您可能需要也可能不需要在代码库中工作,在代码库中定义非标准控制器操作是可以接受的,GET端点返回这样的随机结果可能是可以接受的,也可能是不可以接受的(这两种情况都可能打破REST的严格定义)。看看这个答案:了解更多的上下文
就个人而言,如果我不太关心RESTful ness,我会向ScriptLinesController添加一个新操作,如下所示:

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

随着<代码>随机函数随着时间的推移变得更加复杂,我会考虑把它移到<代码> Script Pult> /Cult>模型。如果增加了更多的复杂性,这在逻辑上都与“随机脚本行集合”的概念有关,我会将代码转移到另一个单独的模型中,并创建一个新的控制器

嗨,我投了赞成票,非常感谢你的建议。我现在意识到,我没有问我的问题中最重要的部分,是否只有7条标准restful“show”、“index”、“update”等路由才能使API保持restful,或者是否可以创建符合“REST原则”的特殊函数,不管这意味着什么。我会编辑我的问题来做这件事,如果你的答案也能回答的话,我会接受你的答案。还有一个问题,当你说“在数据库级别”,这是否意味着使用控制器方法进行操作?@a.Lelli所说的“在数据库级别”,我的意思是像我在示例中所做的那样。您仍然在控制器(或控制器调用的模型)中编写代码,但实际的选择或聚合是由DB完成的。在本例中,我将使用
order(RANDOM())
limit
一起在数据库中而不是在ruby中拾取随机行。明白了!再次感谢!