我正在为projects
构建模板,其中一部分涉及将模板team_members
添加到project
,其中team_members
充当projects
之间的联接表1}}和users
。
例如,我知道我的project
模板将有team_members
类型为“Developer”和“Manager”,但我不知道哪个users
将填充这些角色模板级别。
如果我用一些JSON数据将其映射出来,这就是它在概念上的样子:
team_member_types: [
{ id: 1, name: "Developer" },
{ id: 2, name: "Manager" },
],
project: { id: 1, title: "Template project title", template: true },
team_members: [
{ project_id: 1, team_member_type_id: 1, user_id: nil }, # => "Developer"
{ project_id: 1, team_member_type_id: 2, user_id: nil }, # => "Manager"
]
当我使用模板制作真实项目时,我想将真实用户添加为team_members
,但我想根据我添加它们的角色来过滤users
列表上。
例如,当我想为“Developer”角色添加真实user
时,我只想查看标记为“Developers”的用户列表。这意味着我在team_member_type
表上也有一个users
关联。
user: { id: 1, name: "John Smith", team_member_type: "Developer" }
当我在我的表单上添加真实的user
:
@team_member_type = TeamMemberType.find_by(name: "Developer")
@filtered_users = User.where(team_member_type_id: @team_member_type)
我遇到的问题是,team_member
联接表似乎必须在其上关联team_member_type
以在模板阶段标记它,但关联的user
}还有一个team_member_type
与之关联,以便过滤。因此,当我向user
添加真实的project
时,结果是:
@team_member = TeamMember.find(1)
@team_member.team_member_type.name = "Developer"
@team_member.user.team_member_type.name = "Developer"
我有两种不同的方式存储相同的“数据”。这似乎是一个问题,但我不知道如何用我当前的数据库结构解决它。有没有办法重新组织关联,所以我只将这些数据存储一次?
实际的Rails模型如下所示:
class Project < ApplicationRecord
has_many :team_members
end
class TeamMember < ApplicationRecord
belongs_to :project
belongs_to :user
belongs_to :team_member_type
end
class TeamMemberType < ApplicationRecord
has_many :team_members
has_many :users
end
class User < ApplicationRecord
has_many :team_members
belongs_to :team_member_type
end