从其他控制器调用模型方法的 Rails 最佳实践

Rails best practice for calling a model method from a different controller

提问人:aj soprano 提问时间:7/13/2022 更新时间:7/13/2022 访问量:451

问:

我有 和 。我有一种方法,我想打电话给.但我不确定这样做的最佳做法是什么。这是我现在的方法:Model_amodel_a_controllerModel_bmodel_bmodel_a_controller

def method
   id = Model_b.method
   .... some other stuff
end 

我直接从模型调用该方法,但是也许制作模型的实例然后从该实例调用该方法是否更好?类似的东西

    def method
   @model_b = Model_b
   id = @model_b.method
   .... some other stuff
end 

我不太确定最佳实践是什么,或者我的替代方案是否有意义;欢迎任何指点。

Ruby-on-Rails Ruby 方法 模型 控制器

评论

0赞 spickermann 7/13/2022
我认为,任何好的答案都很大程度上取决于该方法的作用?是实例方法还是类方法?如果它与模型 b 的域高度相关,或者它是否也可以适合模型 a 的域,或者两者兼而有之,或者是否适合一个独立的帮助程序类?
0赞 aj soprano 7/13/2022
@spickermann 该方法从数据库表中获取值Model_b

答:

0赞 agi 7/13/2022 #1

这取决于您想要实现的目标以及背景是什么。我只能回答一些快速的指导性问题,这些问题可能是你自己决策的起点。

我在您的问题中看到两个不同的线程:

  1. 类方法与实例方法为此,在哪里调用 .这是关于它的逻辑和责任。这个方法应该做什么?您需要一个实例(例如)吗?或者它是仅与类或所有模型 B 实例相关的行为(例如)?想想这种方法的结果以及实现它需要什么。method_bModel B@instance_B.valid?Model_B.count

  2. 在哪里打电话method_b根据经验,在轨道上,一个好的做法是保持纤细的控制器。 和 之间有什么关系吗?那么可能最好将 .也许您应该考虑为此添加服务层?https://www.toptal.com/ruby-on-rails/rails-service-objects-tutorial考虑模型和控制器操作之间的关系。model Amodel Bmethod_bmodel A

没有总是有效的严格规则。这取决于业务环境、应用程序设计和开发方向。 如果您提供更具体的例子,那么我们可以给出更具体的建议,并讨论不同方法的利弊。

0赞 Luis Sebastian Cantillo 7/13/2022 #2

也许你可以创建一个这样的服务对象: 在应用程序中,创建一个文件夹 services(app/services)

在 services 文件夹中,您可以组织项目的所有服务。

services/model_b_service/model_b_method.rb

module ModelBService
class ModelBMethod
 def initialize
 end
 def call
 .. logic goes here
 end
end

因此,在您的控制器中:

def method
   id = ModelBService::ModelBMethod.new.call
   .... some other stuff
end 

如果您只想传递参数并在 initialize 方法中获取ModelBService::ModelBMethod.new(args).call