Rails - 两个模型之间的多个关系

时间:2017-05-07 07:09:10

标签: ruby-on-rails activerecord relationship

我的应用中有一个现有的数据库迁移,其中包含以下内容:

class User < ApplicationRecord
    has_many :courses
end

class Course < ApplicationRecord
    belongs_to :user

    has_and_belongs_to_many :locations
    has_and_belongs_to_many :categories
end

每个用户都可以为{} likedislike投票一次,因此我在db/migrate中创建了一个联接表:

class CreateUsersCourses < ActiveRecord::Migration[5.0]
    def change
        create_table :users_courses do |t|
        t.integer :course_id, null: false
        t.integer :user_id, null: false
    end
end

现在我不确定如何在UserCourse模型中添加新关系,这种关系不会与One-Many关系重叠。

2 个答案:

答案 0 :(得分:2)

首先,不要忘记类之间的关联应该描述关联的本质。在这种情况下,有多种可能的关联:用户可以创建课程,他们可以投票选课程,他们可以学习课程。关联的简单Rails命名约定不会帮助您理解它。

如果课程是由单个用户创建的,则该关系应该是course :belongs_to :creating_useruser has_many :created_courses。您可以在课程表中添加user_id列。

要允许用户对课程进行投票,您可以在它们之间使用连接表。但是,您的关联应该描述关联的性质,因此调用连接表user_course_votes是有意义的。然后,您可以与has_many :user_course_voteshas_many :course_votes, :through :user_course_votes的用户建立关联,并在该课程上建立适当的关联。

您需要做的唯一事情就是在关联定义中为类或源命名。<​​/ p>

class User < ApplicationRecord
  has_many :created_courses, class_name: "Course"
  has_many :user_course_votes
  has_many :course_votes, through: :user_course_votes, source: course
end

此方法允许您在用户和课程之间添加其他关联,并为其分配有意义的名称,这将使您的代码更易于编写和理解。

答案 1 :(得分:0)

  1. 现在,您需要将User has_many :courses, through :user_courses添加到用户。

  2. 创建一个新的迁移,在User上添加一个布尔属性来表示你喜欢/不喜欢。

  3. 课程可能有很多用户。想要查看课程的所有用户是有意义的。