据我了解,您要实现的目标是这样的:
给定用户的健康档案可以具有许多健康特征(体重、疾病等)。
您希望将与健康特征相对应的模型放在一个模块中,以清楚地将它们与应用程序的其他部分分开
这实际上是使用“健康”模块的一个很好的案例,就像您对 Health::Weight 和 Health::Diseases 所做的那样。
但是您不应该使用名为 Health 的模型作为将用户与其健康特征联系起来的模型。
这首先会导致语义上的混淆,但它在代码中也不起作用:Health 不能同时是 ActiveRecord::Base 子类(或其他“ORM 类”)和封装其他表(如体重和疾病)的模块.
=> 用更清晰的模型名称替换您的健康模型,清楚地表明它是用户与其健康特征(体重、疾病等)之间的联系。例如用户健康档案。
最终结构将是:
class User
has_one :user_health_profile
end
class UserHealthProfile
belongs_to :user
has_one :weight
has_many :diseases
end
module Health
def self.table_name_prefix
'health_'
end
end
class Health::Weight
belongs_to :user_health_profile
end
class Health::Disease
belongs_to :user_health_profile
end
您还可以将 UserHealthProfile 模型放入 Health 模块中,如下所示:
class Health::UserHealthProfile
end
注意:将模型封装到模块中时,您可能需要在定义关联时添加一个 class_name 参数,但这取决于您的实际模块结构。
例子:
# let's say UserHealthProfile doesn't belong to the Health module
class UserHealthProfile
belongs_to :user
has_one :weight, class_name: Health::Weight
has_many :diseases, class_name: Health::Disease
end