如何添加模块的关联?

时间:2013-08-23 13:12:30

标签: ruby-on-rails ruby database module ruby-on-rails-4

如何在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

我这个好方法吗?

3 个答案:

答案 0 :(得分:1)

据我所知,你想要实现的目标是这样的:

  1. 给定用户的健康状况可能具有许多健康特征(体重,疾病等)。

  2. 您希望在模块中放置与健康特征相对应的模型,以便将它们与应用的其他部分明确区分开来


  3. 这对于使用“健康”模块实际上是一个很好的案例,就像你对健康::体重和健康::疾病一样。

    但是,您不应该使用名为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)

一点都不好。

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

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

我的建议不是让模型像树一样,而是从真正的问题开始解决。

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