我设置了一个has_many:通过用户和组织模型之间的关联,使用Membership模型作为连接。
class Organisation < ActiveRecord::Base
has_many :memberships
has_many :users, :through => :memberships
end
class User < ActiveRecord::Base
. . .
has_many :memberships
has_many :organisations, :through => memberships
end
class Membership < ActiveRecord::Base
belongs_to :user
belongs_to :organisation
end
当用户创建组织时,我希望自动创建一个成员资格,将用户链接到该组织。
攻击它的最佳位置在哪里?
我一直在调查的选项:
在组织上使用after_create回调
将此过程移至单独的Ruby类中。
在组织Controller中,创建操作。
你会怎么推荐我去做?
Rails指南中是否有某处概述了此类事情的最佳实践?
Rails 4.2.5。
答案 0 :(得分:1)
#config/routes.rb
resources :organizations #-> url.com/organizations/new
#app/controllers/organizations_controller.rb
class OrganizationsController < ApplicationController
before_action :authenticate_user!
def new
@organization = current_user.organizations.new
end
def create
@organization = current_user.organizations.new organization_params
@organization.save
end
private
def organization_params
params.require(:organization).permit(:x, :y, :z) #-> membership automatically created
end
end
以上将自动创建相关成员资格;假设您正在使用Devise
&amp;可以访问current_user
方法。
-
最佳做法是最简洁的;没有办法你意味着&#34;去做吧。
我在Rails中看到的一个最大的谬论是人们试图找到最可接受的做事方式(好像有一本规则手册)。您可以做的最好的事情是让它正常工作然后重构代码。
当您浏览应用时,您会发现某些模式可以更改,某些模式可以删除,并且可以组合使用。您创建代码的"DRY"越多(通常)就越好。
答案 1 :(得分:0)
我的想法是3. Normaly,当在模型中建立多个关联时,我们应该通过控制器自动创建临时表记录。
例如,在控制器中,您可以写:
@organisation = current_user.organisations.build organisation_params
if @organisation.save
....
因此,如果@organisation保存,则在该成员资格记录自动生成之后
你可以看到这个教程看到:
http://blog.teamtreehouse.com/what-is-a-has_many-through-association-in-ruby-on-rails-treehouse-quick-tip
答案 2 :(得分:0)
我认为你应该能够做到这样的事情:
org = Organisation.new
org.otherstuff = "populate other stuff"
org.users = [user_who_created]
org.save
之后两者应该相关......?如果你想封装这种行为,你可以做类似create_org_for_user(name, user)
之类的组织上的类方法,然后在那里做这个逻辑,或者你可以在处理创建的控制器动作中做到这一点。
答案 3 :(得分:0)
攻击它的最佳位置在哪里?
我想说你应该在OrganisationsController's
create
行动中写这个,以便在更新操作上做出 DRY
(使用强参数)。因为您获得的表单属性来自外部世界,所以最好使用强参数化概念在permit method
上使用required params
。
def create
@organisation = Organisation.new(organisation_params)
...
end
def organisation_params
# here you could write all the params which you want to permit from outer worlds
end
的更多信息
答案 4 :(得分:0)
如果除了创建组织和成员资格之外没有任何其他逻辑,我会做#3。但是,如果您计划在将来添加更多逻辑来创建新组织,我会创建一个新的service(#2)。