如何在rails中建立多对多的关系

Kar*_*ran 10 migration ruby-on-rails associations has-and-belongs-to-many

我是rails的新手,我正试图在我的rails项目中建立多对多的关系.我有一个小策略,但我不确定它是否正确.

目标: 我有一个用户表和一个组表.用户可以是许多组的一部分,每个组可能有许多用户.

战略:

  1. 将用户迁移设置为name:string
  2. 将Group migration设置为name:string
  3. 设置Join表迁移
  4. 设置用户模型,使其具有has_and_belongs_to_many:groups
  5. 设置组模型,使其具有has_and_belongs_to_many:users

这是正确的策略吗?谢谢!

来自答案的Railcast摘要: 对于那些感兴趣的人 - Railcast建议你使用has_many:通过关联,因为上面的策略有限制,你不能添加额外的关系特定信息.

退房:http://kconrails.com/tag/has_many/

The*_*itz 17

首先,我假设您有一个带有字段"name"的用户模型和一个带有字段"name"的组模型.

您需要用户和组之间模型.我们称之为分组:

rails g model grouping user_name:string group_name:string
Run Code Online (Sandbox Code Playgroud)

在分组模型(grouping.rb)中,您放置:

belongs_to :user  
belongs_to :group
Run Code Online (Sandbox Code Playgroud)

在用户模型中:

has_many :groupings, :dependent => :destroy
has_many :groups, :through => :groupings
Run Code Online (Sandbox Code Playgroud)

在组模型中:

has_many :groupings, :dependent => :destroy  
has_many :users, :through => :groupings
Run Code Online (Sandbox Code Playgroud)

在_form文件中编辑或更新用户的配置文件,您将:

<div class="field">
    <%= f.label :group_names, "Groups" %>  
    <%= f.text_field :group_names %>  
</div>
Run Code Online (Sandbox Code Playgroud)

最后,用户类必须知道如何处理表单中的信息.插入user.rb:

  attr_writer :group_names
  after_save :assign_groups

  def group_names
    @group_names || groups.map(&:name).join(' ')
  end

  private

  def assign_groups
    if @group_names
      self.groups = @group_names.split(/\,/).map do |name|
        if name[0..0]==" "
          name=name.strip
        end
        name=name.downcase
        Group.find_or_create_by_name(name)
      end
    end
  end
Run Code Online (Sandbox Code Playgroud)

assign_groups删除所有单词的空白和下行,因此您不会有冗余标记.

现在,您可以在他或她的个人资料的show文件中显示用户的组:

<p>Groups:
  <% @user.groups.each do |group|%>
    <%= group.name %>
   <% end %>
</p>
Run Code Online (Sandbox Code Playgroud)

希望,这有帮助.

  • 因为如果删除用户或组,用户将不再在组中. (3认同)