首页 > 解决方案 > 建立对象之间关系的表格

问题描述

在我的应用程序中,我有User模型Language。用户可以有多种语言,一种语言可以有多个用户。

class Language < ApplicationRecord
  has_and_belongs_to_many :users
end

class User < ApplicationRecord
  has_and_belongs_to_many :languages
end

我想创建一个允许用户向配置文件添加新语言的表单。由于UserLanguage模型已经存在,我想知道如何创建一个不会创建任何新模型的表单,而只是在现有模型之间创建一个关系。

标签: ruby-on-railsruby

解决方案


has_many 和 HABTM 宏都创建了setter_ids_ids=getter,使得关联不同的记录变得很简单:

<%= form_with(model: @user) do |form| %>
  <div class="field">
    <%= form.label :language_ids, "Languages" %>
    <%= form.collection_select(:language_ids, Language.all, :id, :name, multiple: true) %>  
    # or if you prefer checkboxes 
    <%= form.collection_checkboxes(:language_ids, Language.all, :id, :name) %>   
  </div>

  # ...
<% end %>

表单集合助手足够聪明,可以遍历集合,并根据关联是否已经存在来选择/检查。

通过将一个哈希键传递给permit一个空数组作为其值,您可以将一个数组参数列入白名单:

class UsersController < ApplicationController

  def create
    @user = User.new(user_params)
    # ...
  end


  private

  def user_params
    params.require(:user)
          .permit(
            :foo, :bar, :baz,
            langauge_ids: []
          )
  end
end

如果您想首先使用,我也会认真考虑has_and_belongs_to_many。由于没有模型,您无法访问连接表上的任何其他列,例如用户的熟练程度或他们的主要语言。也没有直接查询连接表的直接方法。has_many through:在大多数情况下实际上是一个更好的解决方案。


推荐阅读