我的应用中有一个现有的数据库迁移,其中包含以下内容:
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
每个用户都可以为{} like
或dislike
投票一次,因此我在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
现在我不确定如何在User
和Course
模型中添加新关系,这种关系不会与One-Many关系重叠。
答案 0 :(得分:2)
首先,不要忘记类之间的关联应该描述关联的本质。在这种情况下,有多种可能的关联:用户可以创建课程,他们可以投票选课程,他们可以学习课程。关联的简单Rails命名约定不会帮助您理解它。
如果课程是由单个用户创建的,则该关系应该是course :belongs_to :creating_user
和user has_many :created_courses
。您可以在课程表中添加user_id
列。
要允许用户对课程进行投票,您可以在它们之间使用连接表。但是,您的关联应该描述关联的性质,因此调用连接表user_course_votes
是有意义的。然后,您可以与has_many :user_course_votes
和has_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)
现在,您需要将User has_many :courses, through :user_courses
添加到用户。
创建一个新的迁移,在User上添加一个布尔属性来表示你喜欢/不喜欢。
课程可能有很多用户。想要查看课程的所有用户是有意义的。