【问题标题】:Rails - multiple relationships between two modelsRails - 两个模型之间的多重关系
【发布时间】:2017-05-07 07:09:09
【问题描述】:

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

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 模型中添加新关系,使其不会与一对多关系重叠。

【问题讨论】:

  • 每个Course可以只属于一个User吗?
  • 是的,因为这里的情况是User 创建Course。现在想做User投票Course,不知道怎么添加新关系。
  • 难道你不能在Course 模型上拥有类似/不喜欢的列吗?这可能看起来不正统,但如果Course 只属于一个User,这是最简单的解决方案

标签: ruby-on-rails activerecord relationship


【解决方案1】:

首先,不要忘记类之间的关联应该描述关联的性质。在这种情况下,有多种可能的关联:用户可以创建课程,他们可以为课程投票,他们可能会学习课程。关联的简单 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

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

【讨论】:

    【解决方案2】:
    1. 现在您需要将User has_many :courses, through :user_courses 添加到用户。

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

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

    【讨论】:

    • 现有表是基于我User创建Course的场景,所以1个User可以创建很多课程,但是1个Course只属于1个User。现在我想要将关系添加到 models 以允许 UserCourse 投票。所以我创建了Users_Courses 表,可以认为是Votes 表包含user_idcourse_id。然后我添加到用户:has_and_belongs_to_many :courses, through :users_courses, class :course 但它不起作用
    • 好的,这是属于用户的课程的合理用例。只是表面上听起来很有趣。我会编辑。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多