Rails - 放置模型助手方法的位置

时间:2017-06-07 14:34:29

标签: ruby-on-rails model helper

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

例如:

class SomeModel
  #included stuff
  #fields & attrs

  def modelMethod
      variable = functionality1(functionality2)
      if some condition
        functionality3
      else
        functionality4
      end
  end

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

如果我没错,帮助程序中的代码仅用于View。这个的惯例是什么?

2 个答案:

答案 0 :(得分:4)

privateprotected与您尝试执行的清理类型无关。

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

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

# app/models/some_model.rb
class SomeModel
  include Suspendable
end

然后添加您的模型问题。

# 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

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

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

  module ClassMethods
    def availabilities_by_some_logic
    end
  end
end

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

答案 1 :(得分:1)

如果您有各种模型中使用的方法或方法集:   Rails Concerns

这与private / protected不同,您可以关注私有/受保护的方法。这就是如何提取重复。

如果您拥有模型所需的方法,并且只有模型(不是模型的子类,并且从未在类外部调用过:   private

如果您拥有模型及其子类所需的方法,但不是来自模型外部的方法:   protected

如果您需要能够从课外调用该方法:   既不

this answer详细介绍了