ruby-on-rails - 建立对象之间关系的表格
问题描述
在我的应用程序中,我有User
模型Language
。用户可以有多种语言,一种语言可以有多个用户。
class Language < ApplicationRecord
has_and_belongs_to_many :users
end
class User < ApplicationRecord
has_and_belongs_to_many :languages
end
我想创建一个允许用户向配置文件添加新语言的表单。由于User
和Language
模型已经存在,我想知道如何创建一个不会创建任何新模型的表单,而只是在现有模型之间创建一个关系。
解决方案
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:
在大多数情况下实际上是一个更好的解决方案。
推荐阅读
- html - 如何使用 Flexbox 进行网格布局
- java - 我如何一次有效地更新一个类的数千个实例?
- c# - 自动售货机中的 3 层架构,同时保持 OCP
- java - 有没有办法使用 itext 库清理扫描的 pdf 的矩形区域?
- javascript - 使用 typescript 框架时,所有源代码都在 node_modules 中编译
- javascript - aws 部署 nodejs express 后端提供的 HTML 文件但无法加载反应 js 文件
- git - 创建没有(以前的)本地历史记录的远程分支
- powershell - 在非主节点上运行 pipline jenkins 阶段期间,“powershell.exe”未被识别为内部或外部命令
- c - 程序停止工作并在C中返回值3221225477
- excel - 如何调用命名列表?