如何在Rails中实现这种结构?
User
has_one :health
Health
belongs_to :user
has_many :weights
has_many :diseases
Health::Weight
belongs_to :health
Health::Diseases
belongs_to :health
users
health_id:integer
healths
id:integer
health_weights
current:integer
health_id:integer
health_diseases
name:text
health_id:integer
当我生成r g model Health::Weight current:integer
时,我的Health
是一个没有ActiveRecord的模块:
module Health
def self.table_name_prefix
'health_'
end
end
我这个好方法吗?
答案 0 :(得分:1)
据我所知,你想要实现的目标是这样的:
给定用户的健康状况可能具有许多健康特征(体重,疾病等)。
您希望在模块中放置与健康特征相对应的模型,以便将它们与应用的其他部分明确区分开来
这对于使用“健康”模块实际上是一个很好的案例,就像你对健康::体重和健康::疾病一样。
但是,您不应该使用名为Health的模型作为将用户链接到其健康特征的模型。
这首先导致语义混淆,但它也无法在代码中运行:生命不能同时是ActiveRecord :: Base子类(或其他'ORM类')和封装其他表的模块体重和疾病。
=>将您的健康模型替换为更清晰的模型名称,该名称清楚地表明它是用户与其健康特征(体重,疾病等)之间的链接。例如UserHealthProfile。
结束结构将是:
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
答案 1 :(得分:0)
如果您真的想在模块中生成模型/控制器,请更改:
rails g model Health::Weight current:integer
到
rails g model health/weight current:integer
但就个人而言,我不会打扰,除非你真的拥有这么多模型,否则你无法全部跟踪它们。
答案 2 :(得分:0)
一点都不好。
建模是试图抽象现实世界的对象。除了用户之外,你的模型都不是真实的模型。
用户如何拥有一个健康状况?健康怎么会有很多重量?健康怎么会有很多疾病?在现实世界中,它们都不是可以理解的。
我的建议不是让模型像树一样,而是从真正的问题开始解决。
例如,用户可能有很多体重记录。用户可能患有许多疾病。