Ruby on rails 使用Rails上的build()添加其他模型关系

Ruby on rails 使用Rails上的build()添加其他模型关系,ruby-on-rails,activerecord,Ruby On Rails,Activerecord,目前我有以下四种型号: users <-- agency_memberships --> agencies | | agency_roles 在添加AgencyRole模型之前,当创建用户时,如果参数create\u agency=true,那么这就足以创建一个新的agency(沿着联接表AgencyMembership) #user_controller.rb def创建 @user=

目前我有以下四种型号:

users <-- agency_memberships --> agencies
               |
               |
          agency_roles
       
在添加
AgencyRole
模型之前,当创建用户时,如果参数
create\u agency=true
,那么这就足以创建一个新的
agency
(沿着联接表
AgencyMembership

#user_controller.rb
def创建
@user=user.new(用户参数)
@user.agencies.build(名称:“Demo Agency”)如果参数为[:user][:create_Agency]
如果@user.save!
...
结束
但是,现在我需要在保存之前添加一个有效的
AgencyRole

是否可以使用
.build()
或Rails的最佳做法是什么?

现在,我正在保存之前手动创建所有关系,这虽然有效,但没有那么紧凑:

def创建
@user=user.new(用户参数)
if(参数[:用户][:创建机构])
机构名称=参数[:用户][:机构名称]
agency\u role=AgencyRole.find\u by(名称:“admin”)
@agency\u membership=AgencyMembership.new(agency\u角色:@agency\u角色)
@agency=agency.new(名称:agency\u name)
@agency_membership.agency=@agency
@agency_membership.user=@user
@代理机构成员资格。代理机构角色=代理机构角色

@user.agency_memberships您可以将其封装并与控制器分离,保留
瘦控制器胖模型
,此外,您还可以使用
自动保存
,以自动保存关联

class-AgencyMembershipBuildAgency
def构建机构(属性)
新建机构=机构。使用角色(属性)构建机构
# ...
新华社
结束
结束
#控制器
def创建
if(参数[:用户][:创建机构])
@user.build_-agency(名称:params[:user][:agency_-name],角色:params[:user][:agency_-role])
结束
如果@user.save!#自从我们设置了“自动保存”后,它将拯救机构`
结束

您是如何在4个模型中声明您的活动记录关联的?编辑了我的答案,谢谢您的回答。快速提问,attributes.delete做什么
agency\u role\u name=attributes。删除(:role)
@Yuan Haojiang它将从
属性
散列中提取
:role
,然后我们可以使用提取的值
role
来构建代理角色,还可以使用有效的
属性
散列来构建关联用户代理(因为它不再包含
role
。@袁浩强我更新了我的答案,将摘录
:role
向上移动:D
ID    NAME
-----------
1     admin
2     editor
...
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