Rails - 在哪里放置模型辅助方法

Mat*_*Som 2 model ruby-on-rails helper

由于干净的代码原因,我想对主要的 Model 方法隐藏某些实现。我不希望我的模型包含很多庞大的方法,只包含最清晰和冗长的功能。

例如:

class SomeModel
  #included stuff
  #fields & attrs

  def modelMethod
      variable = functionality1(functionality2)
      if some condition
        functionality3
      else
        functionality4
      end
  end
Run Code Online (Sandbox Code Playgroud)

我应该将我的功能方法放在同一模型文件末尾的aprivateprotectedpart下,还是应该将它们放入帮助文件中?

如果我是对的,助手中的代码仅用于视图。这是什么约定?

fbe*_*ger 5

privateprotected没有任何与清理你正在试图做的类型。

这与继承方法的可见性/访问有关(尽管继承显然可以用于可重用性)。

方法将取决于可重用性。为什么不利用顾虑?假设我们有SomeModel并想要多个模型来实现暂停。

# app/models/some_model.rb
class SomeModel
  include Suspendable
end
Run Code Online (Sandbox Code Playgroud)

然后添加您的模型关注点。

# app/models/concerns/suspendable.rb
module Suspendable
  extend ActiveSupport::Concern

  included do
    has_one :suspension
    scope :active, -> { joins('LEFT OUTER JOIN suspensions').where(suspension: {id: nil} }
  end
end
Run Code Online (Sandbox Code Playgroud)

或者,如果这真的只适用于单个模型,但希望保持模型严格的 DB 操作(不是面向业务的),那么您可能会有命名空间问题。

# app/models/concerns/some_model/availability.rb
module SomeModel::Availability
  extend ActiveSupport::Concern

  module ClassMethods
    def availabilities_by_some_logic
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

http://api.rubyonrails.org/v5.0/classes/ActiveSupport/Concern.html

  • 我明白你的意思。在“Suspendable”示例中,我们将数据库操作和业务逻辑捆绑到可共享的功能中。我认为这并不是严格意义上的一个或另一个(令人困惑吧?),而是功能细分。如果它永远无法共享,那么也许可以命名您对该模型的关注。例如“app/models/product.rb”可能值得“app/models/concerns/product/payable.rb”。虽然可以说“payable.rb”可能会在未来的版本中共享。 (2认同)