【问题标题】:Rails association for has one/belongs to vs has many/belongs toRails 关联 for has one/belongs to vs has many/belongs to
【发布时间】:2016-09-01 17:27:57
【问题描述】:

我要创建两张表,一张是Job,一张是JobType。

每个 Job 都有一个 job_type 即。临时工、兼职或全职。

class Job < ApplicationRecord
  has_one :job_type
end

class JobType < ApplicationRecord
  belongs_to :job
end

所以我的 job_type 表将如下所示

id  type    job_id
1   temp      1
2   temp      2
3   fulltime  3
4   temp      4

好像是多余的……

我应该改为做吗,job 属于 job_type 并且 job_type 有很多这样的工作?

id   name   job_type_id
1   waiter    1
2   waiter    2
3   clerk     1

id   type  
1    temp
2    fulltime

我很困惑。任何帮助表示赞赏。谢谢。

【问题讨论】:

    标签: ruby-on-rails associations


    【解决方案1】:

    一个Job可以有多种job类型,关联会是这样的

    class Job < ApplicationRecord
      has_many :job_type
    end
    
    class JobType < ApplicationRecord
      belongs_to :job
    end
    

    否则,您可以给出关联,例如一份工作有很多工作类型,而一种工作类型有很多工作。

    class Job < ApplicationRecord
      has_and_belongs_to_many :job_type
    end
    
    class JobType < ApplicationRecord
      has_and_belongs_to_many :job
    end
    

    【讨论】:

    • 如果一个工作只能有一个工作类型怎么办?只能是全职、兼职还是临时的?
    • 哦,Job 我的意思是职位发布,我将职位发布用作职位,我应该为 job_post 创建一个新表吗?
    • 如果一个工作只有一个 job_type 那么你必须使用 has_one :job_type 在模型中进行关联。
    • 是的,对于 job_post,您必须创建另一个可以与作业关联的表。
    【解决方案2】:

    这个问题适合many-to-many relationship
    一个job has_many job_types,任何job_type 都可以has_may jobs

    为此,您需要一个连接表 - jobs_jobs_types

    您的数据将如下所示:

    jobs
    id   name   
    1   waiter  
    2   clerk   
    
    jobs_types
    id   type  
    1    temp
    2    fulltime
    
    jobs_jobs_types
    job_id job_type_id
    1 1
    1 2
    2 1
    

    我会把代码留给你。 :) 您可以在此Railscast 中获得更多帮助。

    【讨论】:

    • 如果职位表实际上是职位发布怎么办?我要使用另一张桌子吗?我还是有点迷茫。
    • 不清楚你在问什么。根据您最初提出的问题和您提供的数据,可以看到具有多种工作类型的工作(反之亦然)。工作表 --> 职位发布是根据您的方便。
    【解决方案3】:

    Ruby 只是一种简单的编程语言。正如我们所说,它完全有效。

    For eg: A Posts has_many Comments and Comments belongs_to Post.
    

    在这里你可以清楚地看到这里的复数告诉我们,一个特定的帖子有很多 cmets。 同样的想法适用于 has_one 关系、User has_many Votes 和 Votes belongs_to User。 因此,因此,在您的情况下,我建议您将关联写为 job has_many types 和 job_types 属于 job。

    因此这里的 job_types 表将使用表作业的主键作为外键来规范化数据。

    【讨论】: