我有一个ActiveRecord模型Reservation
它达到了这样一个程度,即班级规模大而且做得太多
我想将它分成几个不同的,并将它们放在Reservation
模块下。
不幸的是,这会破坏应用程序。
此时我看到以下选项:
ReservationConcerns
或类似的Reservation
类本身,但实际将其移动到子目录(Reservation
将位于app/models/reservation.rb
,Reservation::Pipeline
将位于app/models/reservation/pipeline.rb
等等)。所以问题是如何构建已经将其作为一个单一,庞大的类而不破坏应用程序的功能的不同问题。
答案 0 :(得分:0)
如果要在不更改公共接口的情况下将Ruby类拆分为不同的组件,一种解决方案是使用模块:
# app/models/reservation.rb
class Reservation < ActiveRecord::Base
# associations, validations, etc.
include Pipeline
end
# app/models/reservation/pipeline.rb
module Reservation::Pipeline
def some_pipeline_method
# ...
end
def other_pipeline_method
# ...
end
end
ActiveRecord还提供observers,“这是减少通常在模型类承担与类的核心职责无关的功能时通常会出现的混乱的好方法”。观察者经常大量使用ActiveModel::Dirty方法。
这些建议是免费的:模块可以帮助您将界面分组到更多本地块,而观察者可以使后端细节更加独立。从这里开始,如果不确切地知道你想要突破的部分,就很难具体化。