导轨 - 两种型号

问题描述:

之间的多重关系,我有我的应用程序的现有数据库迁移,它包含以下内容:导轨 - 两种型号

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模型,并不能使它与一人重叠添加新关系y关系。

+0

每个“课程”只能属于一个“用户”吗? – Iceman

+0

是的,因为这里的情况是'用户'创建'课程'。现在我想做'用户'投票'课程',不知道如何添加新的关系。 –

+0

难道你不能像那样只是你的“课程”模型中的一个专栏吗?这似乎是非正统的,但它是最简单的解决方案,如果'课程'曾经只属于一个'用户' – Iceman

首先,不要忘记,类之间的关联应该描述关联的性质。在这种情况下,存在多种可能的关联:用户可以创建课程,他们可以投票选择课程,并且他们可以学习课程。这些关联的简单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的用户建立关联关系,并在课程中进行适当的关联。

无论你喜欢什么,你需要做的唯一事情就是在关联定义中命名类或源。

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. 现在您需要将User has_many :courses, through :user_courses添加到用户。

  2. 创建新迁移以在用户上添加布尔属性来表示您的喜欢/不喜欢。

  3. 课程可能有很多用户。想要看到课程的所有用户是有道理的。

+0

现有的表是基于我的情景,用户'创建'课程'所以1'用户'可以创建许多课程,但1''课程'只属于1'用户'。现在我想添加关系到这些'模型',以允许'用户'投票'课程'。所以我创建了'Users_Courses'表,它可以被视为'Votes'表,包含'user_id'和'course_id'。然后我添加到用户:'has_and_belongs_to_many:courses,through:users_courses,class:course'但它不起作用 –

+0

对于属于用户的课程而言,这是一个合理的用例。它表面上听起来很有趣。我将编辑。 –