我正在开发我的第一个真正的Rails 4应用程序,我遇到了我的设计问题。
目前我有一个“服务”模型,它以name,online_status,ip,dns_name,port和service_type等属性开头。这个模型已经发展到包含特定service_types的许多方法和属性(比如auth_tokens等),因此它非常杂乱。添加到数据库中的列以满足不同类型服务的需要,使得该模型就像没有单独的类/模型的STI的贫民窟版本。
服务模型还有ping()等方法,用于确定online_status。我相信服务的类型不同,足以保证他们自己的独立表,因为每个服务似乎都有许多独特的属性和方法。
示例:
通用服务有:name,ip,dns_name,online_status等......
Plex等特定服务将具有:name,ip,dns_name,online_status,username,password,auth_token等...
问题是,我希望能够从其父服务类访问更具体的服务类型。因此,当我创建一个视图时,我可以循环遍历所有通用服务和更具体的服务,就像它们都是相同类型的服务一样(或者至少能够以某种简单的方式访问所有服务而无需遍历每个类型和附加他们)。
我还需要自己访问特定类型的模型,因此在我的视图中执行类似@ couchpotatos.each的操作只会通过Couchpotato类的实例。
控制器也会遇到这种混乱,因为我不知道如何让单个页面显示来自同一控制器的所有这些不同类型的模型。
欢迎批评!我正在学习,所以如果这个想要的设计绝对疯狂,请告诉我:D
答案 0 :(得分:0)
好的,让我们开枪吧。我希望我理解你目前的情况,但首先想到的是使用包含服务共享逻辑的ServiceConcern
。所以一个基本的例子是:
module Service
extend ActiveSupport::Concern
included do
belongs_to :user
end
def ping
"pong"
end
end
class PlexService < ActiveRecord::Base
include Service
def ping
"plex-pong"
end
end
您将为每个Service实现创建一个新模型,该模型必须具有Service应具有的内容(在上面的情况下,它将是user_id
)
剩下的问题是找到服务问题的所有实现的通用方法。
要实现这一点,您必须实现一个STI,其中Base对象将是&#34; Service&#34;使用user_id和类型(在上面描述的情况下)和带有覆盖的实现