【发布时间】:2021-05-13 01:28:47
【问题描述】:
目前我有以下四种型号:
users <-- agency_memberships --> agencies
|
|
agency_roles
agency_memberships 是一个连接表,agency_roles 是一个包含角色的小型查找表:
ID NAME
-----------
1 admin
2 editor
...
在添加AgencyRole 模型之前,当创建用户时,如果参数create_agency = true,那么这足以创建一个新的Agency(沿着连接表AgencyMembership)。
# user_controller.rb
def create
@user = User.new(user_params)
@user.agencies.build(name: "Demo Agency") if params[:user][:create_agency]
if @user.save!
...
end
但是,现在我需要在保存之前添加一个有效的AgencyRole。
是否可以使用 .build() 这样做,或者 Rails 的最佳做法是什么?
现在,我在保存之前手动创建所有关系,这可行但不够紧凑:
def create
@user = User.new(user_params)
if (params[:user][:create_agency])
agency_name = params[:user][:agency_name]
agency_role = AgencyRole.find_by(name: 'admin')
@agency_membership = AgencyMembership.new(agency_role: @agency_role)
@agency = Agency.new(name: agency_name)
@agency_membership.agency = @agency
@agency_membership.user = @user
@agency_membership.agency_role = agency_role
@user.agency_memberships << @agency_membership
end
if @user.save!
...
end
编辑:我的模特关系如下:
class AgencyMembership < ApplicationRecord
belongs_to :agency
belongs_to :user
belongs_to :agency_role
end
class AgencyRole < ApplicationRecord
validates :name, uniqueness: { case_sensitive: false }, presence: true
end
class Agency < ApplicationRecord
has_many :agency_memberships
has_many :projects
has_many :users, through: :agency_memberships
end
class User < ApplicationRecord
has_many :agency_memberships, inverse_of: :user
has_many :agencies, through: :agency_memberships
end
【问题讨论】:
-
您是如何在 4 个模型中声明活动记录关联的?
-
编辑了我的答案,谢谢
标签: ruby-on-rails activerecord