2017-05-07 59 views
0

之間的多重關係,我有我的應用程序的現有數據庫遷移,它包含以下內容:導軌 - 兩種型號

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

回答

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的用戶建立關聯關係,並在課程中進行適當的關聯。

無論你喜歡什麼,你需要做的唯一事情就是在關聯定義中命名類或源。

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 

這種方法允許你添加用戶和課程之間的其他關聯,並指定有意義的名字給他們,這將使你的代碼更容易編寫和理解。

0
  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

對於屬於用戶的課程而言,這是一個合理的用例。它表面上聽起來很有趣。我將編輯。 –