我是Ruby的新手,也是Rails的新手。
我有一个查询两个不同数据模型的方法,结合结果并返回组合结果
def combine_models
...
end
该方法目前驻留在控制器中。我想将方法移动到模块或类(仍然不确定哪个),以便该方法可以在多个控制器中使用。
1)放置这个的最佳位置在哪里?
2)它应该是一个模块还是一个类?
3).rb文件的内容是什么样的?
目前我在/models/combine_class.rb
中有。该文件的内容是:
class CombineClass
def combine_models
...
end
end
该类似乎自动加载,但要调用该方法,我必须使用CombineClass.new.combine_models
。
4)这是调用方法的正确方法吗?有没有办法可以在没有.new.
的情况下调用方法?
答案 0 :(得分:1)
我建议你阅读这篇文章:Structuring Rails Applications并将你的逻辑提取到app/usecases/model1_model2_combiner_usecase.rb
(app/models
并不是一个非常好的地方),这可能看起来像这样:
class Model1Model2CombinerUsecase
def self.run
...
end
end
当然要正确地重命名,然后只需在控制器中用
调用它@combined_models = Model1Model2CombinerUsecase.run
答案 1 :(得分:0)
我建议输入模型目录的Concer文件夹。
模型/关切/ combine_models.rb:
module CombineModels
extend ActiveSupport::Concern
def combine_model1_model2
...
end
end
在您的模型中,您可以包含模块:
class Model1
include CombineModels
...
end
class Model2
include CombineModels
...
end
您可以在每个模型中使用组合方法,其中包括CombineModels模块
答案 2 :(得分:0)
将类保留在模型目录中并没有什么问题,尽管最新的Rails约定是让它成为一个问题。
如果您只想要两个模型的某些属性的聚合,并且没有其他行为,您的组合类将实现,我将使用这样的简单解决方案。
class CombineFooAndBar
def self.combine_models(f, b)
f.x + b.y
end
end
class Foo
attr_accessor :x
end
class Bar
attr_accessor :y
end
f = Foo.new
f.x = 2
b = Bar.new
b.y = 3
puts "CombineFooAndBar value is #{CombineFooAndBar.combine_models(f,b)}"
如果您以后需要更多行为,那么我会在那时重构它。