我有 3 個模型用戶專案錯誤。我想通過創建多對多關系。我在模型中創建關系我不知道它是否正確,用戶有用戶型別列,它是列舉型別用戶型別包含開發人員、經理、QA
user.user_type.manager belong to many project it has one to many relation
user.user_type.developer has many project and many project belong to developer. it has many to many realtion
project has many bugs and bugs belong to project
developer has many bugs and many bugs belong to developer
錯誤模型
class Bug < ApplicationRecord
belongs_to :project
has_many :developers, -> { where user_type: :Developer }, class_name: 'User', through: :project, source: :bugs
end
專案模型
class Project < ApplicationRecord
has_many :bugs, dependent: :delete_all
has_many :developers, -> { where user_type: :Developer }, class_name: 'User', through: :users, source: :project
has_many :users //it belong to manager_id
end
用戶模型
class User < ApplicationRecord
enum user_type: %i[Manager Developer QA]
has_many :projects
has_many :bugs
end
developer_bug 模型
class DevelopersBug < ApplicationRecord
has_many :bugs
has_many :users
end
project_developer 模型
class ProjectsDeveloper < ApplicationRecord
has_many :projects
has_many :users
end
uj5u.com熱心網友回復:
這
has_many :developers, -> { where user_type: :Developer },
class_name: 'User',
through: :users,
source: :project
不是你想的那樣。它的意思是:
我已經有一個關聯“用戶”。用戶有一個關聯“專案”。
請配置一個關聯,使兩個 JOIN 都加入并給我與關聯用戶關聯的專案串列。
該關聯將被命名為“開發者”并且屬于“用戶”類的物件。
您可以看到這些說明是如何不一致的。這
has_many :projects, through: :users, source: :project
將通過跳過用戶來定義相關專案的串列。
另一方面,這是:
has_many :developers, -> { where user_type: :Developer }, class_name: 'User'
將定義與所有用戶的子集的直接多關聯。
根據您的描述,您的資料模型似乎是錯誤的,也許這會更好:
class User < ApplicationRecord
has_many :managed_projects, inverse_of: :manager, class_name: 'Project'
has_and_belongs_to_many :projects
has_many :bugs
end
class Project < ApplicationRecord
belongs_to :manager, class_name: 'User', inverse_of: :managed_projects
has_and_belongs_to_many :users
has_many :bugs
end
class Bug < ApplicationRecord
belongs_to :user
belongs_to :project
end
您的架構應包括三個表,以及一個額外的多對多連接表projects_users,該表包含用戶和專案的外鍵。
uj5u.com熱心網友回復:
正如重寫已經在他的出色回答中指出的那樣,您的資料模型存在缺陷。你想要的是一個連接用戶和專案的連接表:
class User < ApplicationRecord
has_many :project_roles
has_many :projects, through: :project_roles
end
class ProjectRole < ApplicationRecord
belongs_to :user
belongs_to :project
end
class Project < ApplicationRecord
has_many :users
has_many :projects, through: :project_roles
end
然后,如果您想在專案中為用戶提供特定角色,您可以將列舉添加到連接表中,這就是它開始變得棘手的地方,所以請耐心等待:
class ProjectRole < ApplicationRecord
enum roles: [:manager, :developer, :qa]
belongs_to :user
belongs_to :project
end
class User < ApplicationRecord
has_many :project_roles
has_many :projects, through: :project_roles
has_many :project_roles_as_manager,
-> { manager }, # short for `where(role: :manager)`
class_name: 'ProjectRole'
has_many :projects_as_manager,
class_name: 'Project',
through: :project_roles_as_manager,
source: :project
has_many :project_roles_as_developer,
-> { developer },
class_name: 'ProjectRole'
has_many :projects_as_developer,
class_name: 'Project',
through: :project_roles_as_developer,
source: :project
# ...
end
這定義了具有默認范圍的關聯,然后通過該關聯加入。然后你會在關聯的另一端做同樣的事情:
class Project < ApplicationRecord
has_many :users
has_many :projects, through: :project_roles
has_many :manager_project_roles,
-> { manager },
class_name: 'ProjectRole'
has_many :managers,
through: :manager_project_roles,
source: :user
# ...
end
當然,這是很多重復,您可以通過回圈ProjectRoles.roles.keys和動態定義關聯來減少這些重復。
這是一種非常靈活的建模方式,它對域做出盡可能少的假設。例如,它允許一個專案的多個經理,它允許用戶在不同的專案中具有不同的角色。
如果您想像通常在跟蹤器中處理問題那樣對“錯誤”進行建模,您將為錯誤創建一個表并為分配創建一個連接表:
class Bug < ApplicationRecord
belongs_to :project
has_many :bug_assignments
has_many :users, through: :bug_assignments
end
class BugAssignment < ApplicationRecord
has_one :project, through: :bug
belongs_to :bug
belongs_to :user
end
class User < ApplicationRecord
# ...
has_many :bug_assignments
has_many :bugs
end
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/416204.html
標籤:
上一篇:如何根據列舉值顯示下拉值
