【问题标题】:Accessing two models from a general class从普通类访问两个模型
【发布时间】:2022-01-27 14:25:09
【问题描述】:

我目前有两个模型大多相似,但连接到不同的表

class MyModel1 < ActiveRecord::Base
  ...
  def my_method
  end
end

class MyModel2 < ActiveRecord::Base
  ...
  def my_method
  end
end

在许多地方,我有条件地获取数据,如下所示

class MyController < ApplicationController
  ...
  def my_action
    item = my_condition ? MyModel1.find_by(code: 123) : MyModel2.find_by(code: 123)
    result = item.my_method
  end
end

class OtherModel < ActiveRecord::Base
  ...
  def other_method(item_id)
    resp = my_condition ? MyModel1.find_by(code: item_id) : MyModel2.find_by(code: item_id)
    ...
  end
end

但是在所有地方都很难维护这种类型的检查。我怎么能把这个概括一下?我知道如果我们从父模型继承,那么子类将可以访问所有父模型方法

class MyGeneralClass < MyModel1
  def initialize
    super
  end
end 

item = MyGeneralClass.find_by(code: 123)

但我不知道如何在 MyGeneralClass 中添加我的检查,以便在其他地方我可以调用所需的模型方法。如下所示

class MyGeneralClass
  def initialize
    klass = my_condition ? MyModel1 : MyModel2
    klass.send(:private_instance_method) 
  end
end

item = MyGeneralClass.find_by(code: 123)

【问题讨论】:

    标签: ruby-on-rails ruby activerecord rails-activerecord


    【解决方案1】:

    您可以向您的应用程序添加一个简单的模块,该模块返回所需的记录,如下所示:

    # in app/models/my_generic_model_finder.rb
    module MyGenericModelFinder
      def self.find_by(condition, query)
        klass = condition ? MyModel1 : MyModel2
        klass.find_by(query)
      end
    end
    

    可以在你的控制器和模型中使用这样的

    MyGenericModelFinder.find_by(my_condition, code: 123)
    

    另一种解决方案可能是只为您的情况返回正确的模型,然后像您只有一个普通模型一样运行所有查询。

    # in app/models/my_conditional_model.rb
    module MyConditionalModel
      def self.for(condition)
        condition ? MyModel1 : MyModel2
      end
    end
    

    可以在你的控制器和模型中使用这样的

    MyConditionalModel.for(condition).find_by(code: 123)
    

    因为MyConditionalModel.for(condition)返回一个类,你也可以做其他查询,比如MyConditionalModel.for(condition).where(foo: 'bar').order(...)

    【讨论】:

    • 我想检查是否有任何方法可以模仿 ActiveRecord 方法。根据您的建议,我可能还必须为where 等标准方法编写通用类的方法?
    • 这取决于您实际使用此查找器的方式、您实际需要区分两种型号的原因以及情况如何。您能否详细说明并为您的问题添加更多示例?
    • 当您希望能够在这些模型上调用 wherecount 等方法时,我使用另一种解决方案更新了我的答案,该解决方案可能更适合您的用例。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-03
    • 1970-01-01
    • 2018-01-29
    • 2018-03-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多