Single Table Inheritance in rails 中的association 写在哪里?
Where to write associations in Single Table Inheritance in rails?
我有一个名为 User 的基础 class,它有 2 个名为 Manager 和 Creator 的子class。我已经为 User、Manager 和 Creator 模型实现了 Single Table Inheritance。
还有另外 2 个模型,名为 Project 和 Bug。
class User < ApplicationRecord
end
class Manager < User
end
class Creator < User
end
class Project < ApplicationRecord
end
class Bug < ApplicationRecord
end
我想要的联想是
- 一个项目可以有很多用户
- 一个经理可以有多个项目
- 一个 Creator 可以创造很多 Bug
我了解这些关系,但我无法理解将关联放在哪里(对于用户及其子classes)。
例如
对于协会:一个Creator可以创造很多Bug
class Creator < User
has_many :bugs
end
协会声明的另一面放在哪里?我是把它写在 User class 还是 Creator class 里面?
即
class Bug < ApplicationRecord
belongs_to :user
end
或
class Bug < ApplicationRecord
belongs_to :creator
end
哪种方法正确?
问题的底线是:
在单一 Table 继承中,我是将(其他模型的)关联到父模型还是子模型?
为了回应您的评论,下面是一种可能的方式来模拟您仅使用 User
、Project
、Bug
和 ProjectUser
而不使用 STI 的枚举关联.
建模 A Creator can create many Bugs
的简单方法可能类似于:
class User < ApplicationRecord
has_many :bugs, foreign_key: :creator_id
end
对于您的 Bug
型号:
# == Schema Information
#
# Table name: bugs
#
# id :integer not null, primary key
# creator_id :integer
# created_at :datetime not null
# updated_at :datetime not null
#
class Bug < ApplicationRecord
belongs_to :creator, class_name: 'User'
end
在这种情况下,角色由关联定义隐含,但您没有明确的 Role
模型。所以如果你有一个 @user
的实例,你可以这样做:
@user.bugs.create bug_attributes
如果你有 @bug
,那么你可以这样做:
@bug.creator
...并取回创建 Bug
.
的 User
同样,要为 A Manager can have many Projects
建模,您可以执行以下操作:
class User < ApplicationRecord
has_many :bugs, foreign_key: :creator_id
has_many :managed_projects, class_name: 'Project', foreign_key: :manager_id
end
# == Schema Information
#
# Table name: projects
#
# id :integer not null, primary key
# manager_id :integer
# created_at :datetime not null
# updated_at :datetime not null
#
class Project < ApplicationRecord
belongs_to :manager, class_name: 'User'
end
同样,该角色隐含在关联定义中。而且,使用 @user
,您可以:
@user.managed_projects.create project_attributes
要对 A Project can have many Users
建模(假设 User can belong to many projects
),您可以使用 ProjectUser
模型,该模型可能类似于:
# == Schema Information
#
# Table name: project_users
#
# id :integer not null, primary key
# project_id :integer
# user_id :integer
# created_at :datetime not null
# updated_at :datetime not null
#
class ProjectUser < ApplicationRecord
belongs_to :project
belongs_to :user
end
然后在你的Project
中,你可以做:
class Project < ApplicationRecord
belongs_to :manager, class_name: 'User'
has_many :project_users
has_many :users, through: :project_users
end
在您的 User
中,您可以:
class User < ApplicationRecord
has_many :bugs, foreign_key: :creator_id
has_many :managed_projects, class_name: 'Project', foreign_key: :manager_id
has_many :project_users
has_many :projects, through: :project_users
end
现在您可以执行 @project.users
和 @user.projects
等操作。
根据您的域和用例,您可能希望将 Role
设为显式 class。但是,那完全是另一回事了。
我有一个名为 User 的基础 class,它有 2 个名为 Manager 和 Creator 的子class。我已经为 User、Manager 和 Creator 模型实现了 Single Table Inheritance。
还有另外 2 个模型,名为 Project 和 Bug。
class User < ApplicationRecord
end
class Manager < User
end
class Creator < User
end
class Project < ApplicationRecord
end
class Bug < ApplicationRecord
end
我想要的联想是
- 一个项目可以有很多用户
- 一个经理可以有多个项目
- 一个 Creator 可以创造很多 Bug
我了解这些关系,但我无法理解将关联放在哪里(对于用户及其子classes)。
例如
对于协会:一个Creator可以创造很多Bug
class Creator < User
has_many :bugs
end
协会声明的另一面放在哪里?我是把它写在 User class 还是 Creator class 里面?
即
class Bug < ApplicationRecord
belongs_to :user
end
或
class Bug < ApplicationRecord
belongs_to :creator
end
哪种方法正确?
问题的底线是:
在单一 Table 继承中,我是将(其他模型的)关联到父模型还是子模型?
为了回应您的评论,下面是一种可能的方式来模拟您仅使用 User
、Project
、Bug
和 ProjectUser
而不使用 STI 的枚举关联.
建模 A Creator can create many Bugs
的简单方法可能类似于:
class User < ApplicationRecord
has_many :bugs, foreign_key: :creator_id
end
对于您的 Bug
型号:
# == Schema Information
#
# Table name: bugs
#
# id :integer not null, primary key
# creator_id :integer
# created_at :datetime not null
# updated_at :datetime not null
#
class Bug < ApplicationRecord
belongs_to :creator, class_name: 'User'
end
在这种情况下,角色由关联定义隐含,但您没有明确的 Role
模型。所以如果你有一个 @user
的实例,你可以这样做:
@user.bugs.create bug_attributes
如果你有 @bug
,那么你可以这样做:
@bug.creator
...并取回创建 Bug
.
User
同样,要为 A Manager can have many Projects
建模,您可以执行以下操作:
class User < ApplicationRecord
has_many :bugs, foreign_key: :creator_id
has_many :managed_projects, class_name: 'Project', foreign_key: :manager_id
end
# == Schema Information
#
# Table name: projects
#
# id :integer not null, primary key
# manager_id :integer
# created_at :datetime not null
# updated_at :datetime not null
#
class Project < ApplicationRecord
belongs_to :manager, class_name: 'User'
end
同样,该角色隐含在关联定义中。而且,使用 @user
,您可以:
@user.managed_projects.create project_attributes
要对 A Project can have many Users
建模(假设 User can belong to many projects
),您可以使用 ProjectUser
模型,该模型可能类似于:
# == Schema Information
#
# Table name: project_users
#
# id :integer not null, primary key
# project_id :integer
# user_id :integer
# created_at :datetime not null
# updated_at :datetime not null
#
class ProjectUser < ApplicationRecord
belongs_to :project
belongs_to :user
end
然后在你的Project
中,你可以做:
class Project < ApplicationRecord
belongs_to :manager, class_name: 'User'
has_many :project_users
has_many :users, through: :project_users
end
在您的 User
中,您可以:
class User < ApplicationRecord
has_many :bugs, foreign_key: :creator_id
has_many :managed_projects, class_name: 'Project', foreign_key: :manager_id
has_many :project_users
has_many :projects, through: :project_users
end
现在您可以执行 @project.users
和 @user.projects
等操作。
根据您的域和用例,您可能希望将 Role
设为显式 class。但是,那完全是另一回事了。