0

如何在 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:integerHealth的是一个没有 ActiveRecord 的模块时:

module Health
  def self.table_name_prefix
    'health_'
  end
end

我这个好办法吗?

4

3 回答 3

1

如果您真的想在模块中生成模型/控制器,请更改:

rails g model Health::Weight current:integer

rails g model health/weight current:integer

但就个人而言,我不会打扰,除非你真的有这么多模型,以至于你无法跟踪它们。

于 2013-08-23T13:26:34.843 回答
1

据我了解,您要实现的目标是这样的:

  1. 给定用户的健康档案可以具有许多健康特征(体重、疾病等)。

  2. 您希望将与健康特征相对应的模型放在一个模块中,以清楚地将它们与应用程序的其他部分分开


这实际上是使用“健康”模块的一个很好的案例,就像您对 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    
于 2013-08-24T10:29:03.300 回答
0

一点都不好。

建模是尝试抽象现实世界的对象。除了用户之外,您的所有模型都不是真实世界的模型。

一个用户怎么会有一个健康?健康怎么会有很多重量?健康怎么会有很多疾病?它们在现实世界中都不是可以理解的。

我的建议是不要把模型做成树,而是从实际问题开始解决。

例如,用户可能有许多体重记录。一个用户可能患有多种疾病。

于 2013-08-23T13:37:04.473 回答