ruby-on-rails - Rails 5 建模多对多关系
问题描述
我有两个模型,项目和用户,我想将它们连接如下:
class Project < ApplicationRecord
belongs_to :owner, class_name: "User"
has_many :members, class_name: "User"
end
class User < ApplicationRecord
has_many :projects
end
迁移看起来像这样。
class AddReferencesToProject < ActiveRecord::Migration[5.2]
def change
add_reference :projects, :owner
add_foreign_key :projects, :users, column: :owner_id, primary_key: :id
end
end
我为 members_id 进行了迁移,但我希望它有多个 user_id:
class AddMembersReferencesToProject < ActiveRecord::Migration[5.2]
def change
add_reference :projects, :members
add_foreign_key :projects, :users, column: :members_id, primary_key: :id
end
end
我是否需要通过关联进行 many_to many :through 关联?我坚持这一点。
解决方案
是的,has_many :through
这对您的多对多关联很有意义。(我不倾向于使用has_and_belongs_to_many
,但这主要是个人喜好。)
它可能看起来像:
用户
# == Schema Information
#
# Table name: users
#
# id :integer not null, primary key
# created_at :datetime not null
# updated_at :datetime not null
#
class User < ApplicationRecord
has_many :owned_projects, class_name: "Project", foreign_key: :owner_id
has_many :project_members, foreign_key: :member_id
has_many :projects, through: :project_members
end
项目
# == Schema Information
#
# Table name: projects
#
# id :integer not null, primary key
# owner_id :integer
# created_at :datetime not null
# updated_at :datetime not null
#
class Project < ApplicationRecord
belongs_to :owner, class_name: "User"
has_many :project_members
has_many :members, through: :project_members
end
项目成员
# == Schema Information
#
# Table name: project_members
#
# id :integer not null, primary key
# member_id :integer
# project_id :integer
# created_at :datetime not null
# updated_at :datetime not null
#
class ProjectMembers < ApplicationRecord
belongs_to :member, class_name: "User"
belongs_to :project
end
推荐阅读
- python - 从python vars中提取数字
- dax - 是否可以在 Power BI 中使用 DAX 插入“空”或空白值,其中某些“piars”值已经存在?
- c# - 从文件 URI 构造 BitmapImage 时找不到组件 (0x88982f50)
- xamarin - Xamarin 表单 System.Text.Json.JsonSerializer 仅在 iOS 上引发 System.TypeInitializationException
- typescript - 如何在打字稿中创建和使用基于泛型 arg 的条件类型?
- c# - C# - 如何使用枚举过滤列表
- asp.net-core - 在 .net core 上使用 Serilog 进行日志记录
- python - 将base64图像字符串解码为Unity中的图像
- tcl - 请解释这个 Tcl if 语句中的表达式
- python - Bertmoticon 包的 bertmoticon.infer() 语句不起作用