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