哪里放两种模型结合的方法

时间:2015-01-28 15:07:34

标签: ruby-on-rails ruby

我是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.的情况下调用方法?

3 个答案:

答案 0 :(得分:1)

我建议你阅读这篇文章:Structuring Rails Applications并将你的逻辑提取到app/usecases/model1_model2_combiner_usecase.rbapp/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)}"

如果您以后需要更多行为,那么我会在那时重构它。