【问题标题】:Mixin for similar Rails models类似 Rails 模型的 Mixin
【发布时间】:2018-06-23 12:01:39
【问题描述】:

我不是一个 Rails 新手,但我肯定离成为专家还有很长的路要走。我理解模块在一般意义上是如何工作的,但我从来没有完全理解如何使用我自己创建的模块来发挥自己的优势。这是一个非常简单的例子,我很确定 mixin 模块是合适且有用的。

My Rails 应用程序模拟足球(足球)比赛。匹配由Match 模型表示。我还有几个模型来表示比赛期间可能发生的事件(例如GoalPenaltyKickCaution)。 Match 模型和这些事件的模型具有has_many/belongs_to 关系。

每个模型都具有三个共同的时间属性:periodminuteorder_within_minute。使用这些列中的信息,我可以编写一个非常简单的<=> 方法来根据它们发生的时间来比较这些事件。至关重要的是,我能够在此基础上比较事件,以便我可以返回匹配中事件的排序列表。

我了解这些模型中的每一个都需要包含相同的代码才能实现我想要的:

include Comparable

def <=>
  ## Comparison code goes here ##
end

在我看来,这可以通过一个 mixin 来完成,将相同的代码应用于每个模型,但我不太确定如何去做。

我意识到这可能是一个非常基本的问题,但是正确的方法是什么?我是否将上述代码块放在一个模块中,include 该模块放在每个模型中,还是我需要做一些不同的事情?我应该把这段代码放在我的文件系统中的什么位置?

【问题讨论】:

    标签: ruby-on-rails model mixins


    【解决方案1】:

    我是否将上述代码块放在一个模块中并将该模块包含在每个模型中,还是我需要做一些不同的事情?

    这正是你所做的。

    我应该把这段代码放在我的文件系统中的什么位置?

    生活在app/models/concerns 中的comparable.rb 下应该没问题,即使它没有使用ActiveSupport::Concern 提供的语法糖。

    【讨论】:

    • 我是否也可以在我的 mixin 中包含这些模型共有的其他模型定义代码?类似validates_presence_of :match?
    • 当然可以! ActiveSupport::Concern 为此提供了一个优雅的 DSL,我建议使用它来提供这些类方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-23
    相关资源
    最近更新 更多