Rails - has_many:通过关联

时间:2016-01-07 04:04:33

标签: ruby-on-rails ruby has-many-through

我设置了一个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

当用户创建组织时,我希望自动创建一个成员资格,将用户链接到该组织。

攻击它的最佳位置在哪里?

我一直在调查的选项:

  1. 在组织上使用after_create回调

  2. 将此过程移至单独的Ruby类中。

  3. 在组织Controller中,创建操作。

  4. 你会怎么推荐我去做?

    Rails指南中是否有某处概述了此类事情的最佳实践?

    Rails 4.2.5。

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

关于Strong Parameters

的更多信息

答案 4 :(得分:0)

如果除了创建组织和成员资格之外没有任何其他逻辑,我会做#3。但是,如果您计划在将来添加更多逻辑来创建新组织,我会创建一个新的service(#2)。